public static boolean diagonals(char[][] b, int row, int col, int l) {
int counter = 1; // because we start from the current position
char charAtPosition = b[row][col];
int numRows = b.length;
int numCols = b[0].length;
int topleft = 0;
int topright = 0;
int bottomleft = 0;
int bottomright = 0;
for (int i=row-1,j=col-1;i>=0 && j>=0;i--,j--) {
if (b[i][j]==charAtPosition) {
topleft++;
} else {
break;
}
}
for (int i=row-1,j=col+1;i>=0 && j<=numCols;i--,j++) {
if (b[i][j]==charAtPosition) {
topright++;
} else {
break;
}
}
for (int i=row+1,j=col-1;i<=numRows && j>=0;i++,j--) {
if (b[i][j]==charAtPosition) {
bottomleft++;
} else {
break;
}
}
for (int i=row+1,j=col+1;i<=numRows && j<=numCols;i++,j++) {
if (b[i][j]==charAtPosition) {
bottomright++;
} else {
break;
}
}
return topleft + bottomright + 1 >= l || topright + bottomleft + 1 >= l; //in this case l is 5
}
上記のコードをここに投稿し終えた後、私は仕方がなく、4つのほぼ同じループを1つのメソッドにマージすることによってコードを単純化したいと思いました。
これが私が望んでいる種類の方法です:
public int countSteps(char horizontal, char vertical) {
}
2つのパラメータhorizontal
であり、またはのvertical
いずれ+
か-
で、4つの方向を示すことができます。可能であれば、の値をとるときにi++;
一般化されます。i horizontal horizontal;
horizontal
+
私が見たくないのはif
、またはswitch
ステートメントです。たとえば、次のようになります。
public int countSteps(char horizontal, char vertical) {
if (horizontal == '+' && vertical == '-') {
for (int i=row-1,j=col+1;i>=0 && j<=numCols;i--,j++) {
if (b[i][j]==charAtPosition) {
topright++;
} else {
break;
}
}
} else if (horizontal == '+' && vertical == '+') {
for (int i=row+1,j=col+1;i>=0 && j<=numCols;i++,j++) {
if (b[i][j]==charAtPosition) {
topright++;
} else {
break;
}
}
} else if () {
} else {
}
}
オリジナルと同じくらい面倒なので。i>=0 && j<=numCols;
たとえば、ループ条件の符号の比較は、と>= && <=
の値の組み合わせに対応していることにも注意してください。horizontal
vertical
言葉遣いがおかしいのでごめんなさい。不明な点があれば教えてください。