2017-05-04 69 views
3

老实说,我可能会过度这一点,但如果你有一个数组和一个真值,那么你如何使所有的水平,垂直和对角线值为真好?二维布尔数组垂直,水平和对角线分配

例如,给出的[X],如何使所有其他值X,以及:

0 0 X 0 0 X 0 0 
0 0 0 X 0 X 0 X 
0 0 0 0 X X X 0 
X X X X X [X] X X 
0 0 0 0 X X X 0 
0 0 0 X 0 X 0 X 
0 0 X 0 0 X 0 0 
0 X 0 0 0 X 0 0 

现在我能够做垂直和水平:

for(int i = 0; i < 8; i++){ 
    for (int l = 0; l < 8; l++){ 
     if (boolean[i][l]){ 
      for (int k = 0; k < 8; k++){ 
       boolean[i][k] = true; 
       boolean[k][l] = true;} 
      } 
     } 
    } 

回答

2

首先,在你的循环,你需要休息远离变量一旦你找到了第一个真正的价值。我建议布尔isFound作为for循环中的条件之一。除此之外,这里是我怎么会去了解它(注:这会正下方的垂直/水平在循环放置):

//positive slope diagonal 
if(((i - Math.min(i, l)) + k) < 8 && ((l - Math.min(i, l)) + k) < 8) 
    testArray[(i - Math.min(i, l)) + k][(l - Math.min(i, l)) + k] = true; 

//negative slope diagonal 
if((k) < 8 && ((l + i) - k) >= 0 && ((l + i) - k) < 8) 
    testArray[k][(l + i) - k] = true; 

在这个例子中,两个对角线分开。对于第一个对角线,我检查它的位置是否在数组的边界内(我将解释我是如何确定位置的)。其次,我确定每个对角线的起始位置的X和Y值,位于在括号内。最后,我通过从起始位置沿X和Y方向移动K个单位(逐步移动)以对角线移动网格来找到位置。对于指向另一方向的诊断重复相同的操作,但是X值减去K,不加,如对角线指向相反的方向。通过查找位置或绘制我的算法,可以找到起始位置和移动的准确逻辑。

例如, enter image description here

放置(请注意,我在变量增加,以确保找到一个真正价值后停止):

boolean notFound = true; 

    for(int i = 0; i < 8 && notFound; i++){ 
     for (int l = 0; l < 8 && notFound; l++){ 
      if (testArray[i][l]){ 
       for (int k = 0; k < 8; k++){ 
        testArray[i][k] = true; 
        testArray[k][l] = true; 

        if(((i - Math.min(i, l)) + k) < 8 && ((l - Math.min(i, l)) + k) < 8) 
         testArray[(i - Math.min(i, l)) + k][(l - Math.min(i, l)) + k] = true; 

        if((k) < 8 && ((l + i) - k) >= 0 && ((l + i) - k) < 8) 
         testArray[k][(l + i) - k] = true;  
       } 
       notFound = false; 
      } 
     } 
    } 
+0

在哪里代码将被放置。它是在第三循环中还是在第二循环中的if语句中?因为如果代码位于第三个循环 –

+0

之内,则此代码无效。 – Drone6251

0

这是一个解决此问题的完整示例。请参阅代码中的注释了解更多详情:

public class Boolean_Array 
{ 
    private static final int SIZE = 8; 

    public static void main(String[] args) 
    { 
     // create the boolean array 
     boolean [][] boolArr = new boolean [SIZE][SIZE]; 

     // 1. Set the row, col of the true 
     int row = 3; 
     int col = 5; 

     // 2. Make the vertical, horizontal and diagonals true 
     for (int i = 0; i < SIZE; i++) 
     { 
      // Do the vertical and horizontal 
      boolArr[row][i] = true; 
      boolArr[i][col] = true; 

      // Do the diagonals 
      setDiagonol(boolArr, row - i, col - i, i); // up and to the left 
      setDiagonol(boolArr, row - i, col + i, i); // up and to the right 
      setDiagonol(boolArr, row + i, col - i, i); // down and to the left 
      setDiagonol(boolArr, row + i, col + i, i); // down and to the right 
     } 

     print(boolArr); 
    } 

    private static void setDiagonol (boolean [][] boolArr, int row, int col, int i) 
    { 
     try 
     { 
      boolArr[row][col] = true; 
     } 
     catch (java.lang.ArrayIndexOutOfBoundsException aioobe) 
     { 
      // catching for convenience so we don't have to check the bounds 
     } 
    } 

    private static void print (boolean [][] boolArr) 
    { 
     for (int i = 0; i < SIZE; i++) 
     { 
      for (int j = 0; j < SIZE; j++) 
      { 
       System.out.print(boolArr[i][j] == true ? "X " : "0 "); 
      } 
      System.out.println(); 
     } 
    } 
} 

输出

0 X 0 0 0 X 0 0 
0 0 X 0 0 X 0 0 
0 0 0 X 0 X 0 X 
0 0 0 0 X X X 0 
X X X X X X X X 
0 0 0 0 X X X 0 
0 0 0 X 0 X 0 X 
0 0 X 0 0 X 0 0 
0

主要类

public static void main(String[] args) { 
    printGrid(3, 2); 
    System.out.println(); 

    printGrid(5, 4); 
    System.out.println(); 

    printGrid(7, 0); 
    System.out.println(); 
} 

public static void printGrid(int x, int y) { 
    boolean[][] grid = new boolean[8][8]; 

    for (int i = 0; i < grid.length; i++) { 
     for (int l = 0; l < grid[0].length; l++) { 

      // horizontal and vertical 
      if (x == i || y == l) { 
       grid[i][l] = true; 
      } 

      // diagonals 
      if (Math.abs(x - i) == Math.abs(y - l)) { 
       grid[i][l] = true; 
      } 

      System.out.print(String.format("%-2s", grid[i][l] == true ? "X" : "O")); 
     } 

     System.out.println(); 
    } 
} 

输出

X O X O X O O O 
O X X X O O O O 
X X X X X X X X 
O X X X O O O O 
X O X O X O O O 
O O X O O X O O 
O O X O O O X O 

O O O O X O O O 
X O O O X O O O 
O X O O X O O X 
O O X O X O X O 
O O O X X X O O 
X X X X X X X X 
O O O X X X O O 
O O X O X O X O 

X O O O O O O X 
X O O O O O X O 
X O O O O X O O 
X O O O X O O O 
X O O X O O O O 
X O X O O O O O 
X X O O O O O O 
X X X X X X X X