2016-11-11 5 views
0

地形表現を使用してフェンスを作成しています。ここで、1はフェンスの土地で、0は空白です。ここでは例えばマップのようになります。地形表現を使用したフェンスの中間部分

1101のコードがどのように動作する

は、それがどのように多くのコーナーと1の側面とカウントをスキャンしていますあなたが必要とするフェンスのメートル、1のすべての側面は2.5メートルです。 j変数はx値に似ていて、iはy値です。私はサイドとコーナーの作業コードを持っています。私が助けが必要なのは、forループの中心にforループを設定する方法です。フェンス。ここに私の作業コードです:

package workspace; 

public class Fencing { 

public static void main(String[] args) { 
    boolean b = true; 
    double corner = 0; 
    double center = 0; 
    double side = 0; 
    int i = 0; 
    int j = 0; 
    int[][] map = { 
     { 0, 1, 1, 0 }, 
     { 1, 1, 1, 1 }, 
     { 1, 1, 1, 1 }, 
     { 1, 1, 0, 1 } 
    }; 
    for (i = 0; i < 3; i++) { 
     for (j = 0; j < 3; j++) { 
      if (map[i][j] != 1 && map[i][j] != 0) { 
       b = false; 
       System.out.println("--> A value of " + map[i][j] + " was found at " + i + "," + j); 
      } 
     } 
    } 
    if (b == false && i == 3) { 
     System.out.println("The map is invalid"); 
     return; 
    } else { 
     System.out.println("Map is valid"); 
    } 
    if (map[0][0] == 1) { 
     corner += 5; 
     if (map[1][0] == 1 && map[0][1] == 1) { 
      corner += 0; 
     } 
     if (map[1][0] != 1 && map[0][1] != 1) { 
      corner += 5; 
     } 
     if (map[1][0] != 1 && map[0][1] == 1 || map[1][0] == 1 && map[0][1] != 1) { 
      corner += 2.5; 
     } 
    } else { 
     corner += 0; 
    } 
    if (map[0][3] == 1) { 
     corner += 5; 
     if (map[1][3] == 1 && map[0][2] == 1) { 
      corner += 0; 
     } 
     if (map[1][3] != 1 && map[0][2] != 1) { 
      corner += 5; 
     } 
     if (map[1][3] != 1 && map[0][2] == 1 || map[1][3] == 1 && map[0][2] != 1) { 
      corner += 2.5; 
     } 
    } else { 
     corner += 0; 
    } 
    if (map[3][0] == 1) { 
     corner += 5; 
     if (map[3][1] == 1 && map[2][0] == 1) { 
      corner += 0; 
     } 
     if (map[3][1] != 1 && map[02][0] != 1) { 
      corner += 5; 
     } 
     if (map[3][1] != 1 && map[2][0] == 1 || map[3][1] == 1 && map[2][0] != 1) { 
      corner += 2.5; 
     } 
    } else { 
     corner += 0; 
    } 
    if (map[3][3] == 1) { 
     corner += 5; 
     if (map[3][2] == 1 && map[2][3] == 1) { 
      corner += 0; 
     } 
     if (map[3][2] != 1 && map[2][3] != 1) { 
      corner += 5; 
     } 
     if (map[3][2] != 1 && map[2][3] == 1 || map[3][2] == 1 && map[2][3] != 1) { 
      corner += 2.5; 
     } 
    } else { 
     corner += 0; 
    } 
    System.out.println("Corner fencing = " + corner); 

    i = 0; 
    j = 0; 
    for (j = 1; j < 3; j++) { // Top 
     if (map[0][j] == 1) { 
      side += 2.5; 
      if (map[0][j + 1] == 1 && map[0][j - 1] == 1) { 
       side += 0; 
      } 
      if (map[0][j + 1] != 1 || map[0][j - 1] != 1) { 
       side += 2.5; 
      } 
      if (map[0][j + 1] != 1 && map[0][j - 1] != 1) { 
       side += 5; 
      } 
     } else { 
      side += 0; 
     } 
    } 
    System.out.println("After the first row, fencing = " + side); 

    i = 0; 
    j = 0; 
    for (j = 1; j < 3; j++) { // Bottom 
     if (map[3][j] == 1) { 
      side += 2.5; 
      if (map[3][j + 1] == 1 && map[3][j - 1] == 1) { 
       side += 0; 
      } 
      if (map[3][j + 1] != 1 || map[3][j - 1] != 1) { 
       side += 2.5; 
      } 
      if (map[3][j + 1] != 1 && map[3][j - 1] != 1) { 
       side += 5; 
      } 
     } else { 
      side += 0; 
     } 
    } 
    System.out.println("After the bottom row, fencing = " + side); 

    i = 0; 
    j = 0; 
    for (i = 1; i < 3; i++) {// Right 
     if (map[i][3] == 1) { 
      side += 2.5; 
      if (map[i + 1][3] == 1 && map[i - 1][3] == 1) { 
       side += 0; 
      } 
      if (map[i + 1][3] != 1 || map[i - 1][3] != 1) { 
       side += 2.5; 
      } 
      if (map[i + 1][3] != 1 && map[i - 1][3] != 1) { 
       side += 5; 
      } 
     } else { 
      side += 0; 
     } 
    } 
    System.out.println("After the first column, fencing = " + side); 

    i = 0; 
    j = 0; 
    for (i = 1; i < 3; i++) {// Left 
     if (map[i][0] == 1) { 
      side += 2.5; 
      if (map[i + 1][0] == 1 && map[i - 1][0] == 1) { 
       side += 0; 
      } 
      if (map[i + 1][0] != 1 || map[i - 1][0] != 1) { 
       side += 2.5; 
      } 
      if (map[i + 1][0] != 1 && map[i - 1][0] != 1) { 
       side += 5; 
      } 
     } else { 
      side += 0; 
     } 
    } 
    System.out.println("After the last column, fencing = " + side); 

} 
} 

私もコアをスキャンするforループを使用する場合、私はわからないんだけど、私はそれが側ループのようなものになるだろうと想像。誰でもコードがどのように見えるのか考えていますか?

+0

この例の出力は何ですか? –

+0

特定のマップについては、配列の1つと同じものですが、中心に0が1つしかないので、2.5となります。 –

+1

codereview.stackexchangeでこの質問をすると.com、彼らはそれを書くよりはるかにクリーンな方法を提案するので、理解しやすく短くて簡単です。コピーペーストには多くのことがあります。コードをコピー&ペーストするときはいつでも、より良い方法があります。 – tucuxi

答えて

0

0と1の行列が与えられているので、1から0まで(上下左右に)何回のトランジションを数えたいでしょうか。それらのそれぞれはフェンスの2.5mストレッチをもたらすでしょう。ボーダーはゼロとしてカウントされます。

これを確認するには、コピーして貼り付けたif文が大量にあります。私はコードのコピー貼り付けを避けるためにメソッドを使用する次の書き換えを提案します。

/** 
* returns the number of zero-or-border neighbors for a 1 
* in a 2D array of ints that can be either 1 or 0 
*/ 
public static int bordersFor(int[][] map, int row, int col) { 
    int borders = 0; 
    // left 
    if (col == 0 || map[row][col-1] == 0) borders ++; 
    // right 
    if (col == map[0].length-1 || map[row][col+1] == 0) borders ++; 
    // up 
    if (row == 0 || map[row-1][col] == 0) borders ++; 
    // down 
    if (row == map.length-1 || map[row+1][col] == 0) borders ++; 

    return borders; 
} 

public static int bordersFor(int[][] map) { 
    int borders = 0; 
    for (int row=0; row<map.length; row++) { 
     for (int col=0; col<map[0].length; col++) { 
      if (map[row][col] == 1) borders += bordersFor(map, row, col); 
     } 
    } 
    return borders; 
} 

public static void main(String ... args) { 
    int[][] map = { 
      { 0, 1, 1, 0 }, 
      { 1, 1, 1, 1 }, 
      { 1, 1, 1, 1 }, 
      { 1, 1, 0, 1 } 
    }; 
    System.out.println(bordersFor(map)); 
} 
関連する問題