当前位置: 首页 > 面试题库 >

Java-2D数组检查对角线数字板

公羊新
2023-03-14
问题内容

目前,我正在开发在8x8 2D阵列板上生成随机0和1的程序。我要做的是检查对角线上的所有数字是否都相同(从角开始,而不仅仅是对角线)。

例:

int[][] array = {
    {0, 0, 0, 0, 0, 0, 0, 1},
    {0, 0, 1, 0, 1, 0, 1, 0},
    {0, 0, 0, 0, 1, 1, 1, 0},
    {0, 0, 0, 0, 1, 1, 1, 0},
    {0, 0, 1, 1, 0, 1, 1, 0},
    {0, 0, 1, 0, 0, 0, 1, 0},
    {0, 1, 0, 0, 0, 0, 0, 0},
    {1, 0, 0, 1, 1, 1, 1, 0}
};

因此,如果偶然从左上角(0,0),(1,1)…(7,7)开始的所有数字均为0或1,那么我必须输出到扫描仪,指示“是0“的主要对角线(来自上面的示例)。

同样从该示例中,我们可以看到从右上角向左下角对角重复数字“ 1”,然后我还必须显示“有一个较小的对角线1”。

到目前为止,我已经弄清楚了如何生成数字并将其输入到数组中,但是我不知道如何检查。这是我到目前为止所拥有的:

public class JavaTest{
// Main method
public static void main(String[] args) {

    int[][] array = {
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 1, 0, 1, 0, 1, 0},
        {0, 0, 0, 0, 1, 1, 1, 0},
        {0, 0, 0, 0, 1, 1, 1, 0},
        {0, 0, 1, 1, 0, 1, 1, 0},
        {0, 0, 1, 0, 0, 0, 1, 0},
        {0, 1, 0, 0, 0, 0, 0, 0},
        {1, 0, 0, 1, 1, 1, 1, 0}
    };

    // Print array numbers
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++)
            System.out.print(array[i][j] + " ");
        System.out.println();
    }
    // Print checkers

    checkMajorDiagonal(array);
}
// Check major diagonal 
public static void checkMajorDiagonal(int array[][]) {
    int majDiag;
    boolean isMatching = true;
    int row = 0;
    for(row = 0; row < array.length; row++){
        majDiag = row;
        if(array[row][row] != array[row+1][row+1]){
            isMatching = false;
            break;
        }
    }
    //If all elements matched print output
    if(isMatching)  
        System.out.println("Major diagonal is all " + array[row][row]);
    }
}

尽管到目前为止,我无法正常工作,因为出现了错误,我仍然必须做较小的对角线。提前致谢。


问题答案:

已经有很多答案。这是另一种方法。您处在正确的轨道上,但是无需通过将对角线元素与下一个元素一起检查等等来使事情复杂化。只需检查每个对角线元素与第一个对角线元素。一旦发现差异,就停止检查!

 public static void checkDiagonal(int[][] array){

     // Start with the assumption that both diagonals are consistent.
     boolean majorConsistent = true; 
     boolean minorConsistent = true;

     int length = array.length;

     int tempMajor = array[0][0];        // all elements in the Major must be equal to this
     int tempMinor = array[0][length-1]; // all elements in the Minor must be equal to this

     // Check major diagonal, and update the boolean if our assumption is wrong.
     for(int i=0; i<length; i++){ 
         if (array[i][i] != tempMajor) { //(0,0);(1,1);(3,3);...
             majorConsistent = false;
             break;
         }
     }

     // Check minor diagonal, and update the boolean if our assumption is wrong.
     for(int i=0,j=length-1; i<length; i++,j--){
         if (array[i][j] != tempMinor) { //(0,7);(1,6);(2,5);...
             minorConsistent = false;
             break;
         }
     }

     System.out.println("Major elements all same = "+majorConsistent);
     System.out.println("Minor elements all same = "+minorConsistent);

 }

这样,您仍然可以同时执行 O(n)中 的检查,并且不需要嵌套for循环! 请注意 ,您可以优化此代码以消除冗余,即具有单个for循环等。



 类似资料:
  • 案例2: 如何检查和以解决这些情况?

  • 我想对布设在板中的int数组执行对角线反射,围绕对角线从左向右下降进行反射。这是一个尝试“翻转一个国际象棋棋盘周围”,同时与N皇后拼图。 null 功能说明:

  • 我有一个连接四个“板”,它是一个6*7的二维字符数组,填充了空格X或o。当在垂直、水平或对角线上有四个X或四个Os在一行中时,满足win条件。我已经成功地检查了垂直和水平的win条件,其中win字符通过如下所示的一些方法返回:

  • 我正在处理C#并发队列和多线程在套接字编程TCP/IP 首先,我已经完成了套接字编程本身。这意味着,我已经完成了关于客户机、服务器和通信本身的编码 到目前为止,我已经实现了putting_data到queue1(Thread1)和全部出列(Thread2),其速度大约是700Mbps 我使用两个concurrent_queue的原因是,我希望通信和类型转换工作在后台处理,而不考虑有关控制的主要过程

  • 问题内容: 我有两个非常大的numpy数组,它们都是3D的。我需要找到一种有效的方法来检查它们是否重叠,因为首先将它们都转换为集合会花费很长时间。我尝试使用在此找到的另一个解决方案来解决相同的问题,但适用于2D阵列,但是我没有设法使其适用于3D。这是2D解决方案: (其中A和B是2D数组)我需要找到重叠的numpy数组的数量,而不是特定的数组。 问题答案: 我们可以利用我在一些问答中使用过的辅助功

  • 我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心