2017-05-04 11 views
3

正直言って私はおそらくこれを思っているかもしれませんが、配列とその値がtrueの場合、水平、垂直、まあ?2Dブール配列垂直、水平、対角の割り当て

たとえば、[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

がまずオフ、あなたのループでは、あなたが最初の真の価値を見つけたら、変数を休憩を離れ必要です。私はあなたのforループの条件の一つとしてboolean isFoundを提案したいと思います。それはさておき、ここで私はそれについて移動したい方法です(注:これは、あなたのループ内で右/垂直、水平の下に配置されます):この例では

//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の値を決定しますかっこ内の最後に、K個の単位を開始位置から対角線上のグリッドを横切るようにX方向とY方向に(段階的に)移動させて位置を見つける。反対方向を指す診断についても同じことが繰り返されますが、対角が反対方向を向いているように、X値にはKが減算され、加算されません。開始位置と移動のための正確なロジックは、位置を突き止めたり、アルゴリズムを引き出したりすることによって最もよく分かります。

例: enter image description here

の配置(私は1つの真値を求めた後に停止することを確認するために変数に追加します):

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

正確にコードが配置されます。 3番目のループの内側か、2番目のループのif文の内側にありますか?このコードは3番目のループ –

+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 
関連する問題