如果2D数组的列中有多个1,则该方法应返回true,但它不起作用。我无法弄清楚它有什么问题,所以我想我会得到一些专家意见。
示例:
10010
01001
10100
将返回true
,因为第一列中有2个。
这是代码
public static boolean isVert(int[][] x) { //checks for more than one 1 in columns
int count = 0;
boolean break2 = false;
boolean check = false; //false means no 2 (or more) queens in same column
for (int i = 0; i < x.length; i++) {
count = 0;
for (int j = 0; j < x[i].length; j++) {
if (x[i][j] == 1) {
count++;
}
if (count > 1) {
break2 = true;
check = true;
break;
}
}
if (break2) {
break;
}
}
return check;
}
答案 0 :(得分:0)
你在整个数组中第一次出现1时就会中断,这可能不是预期的结果。
解释代码的工作原理:
您的代码中的问题是当您找到满足条件的第一行时中断,但您(不一定)检查给定数组中的所有行。
我已经为您更正了代码,希望它可以正常运行(未经测试)
public static boolean isVert(int[][] x) { //checks for more than one 1 in columns
int count = 0;
for (int i = 0; i < x.length; i++) {
int rowCount = 0;
for (int j = 0; j < x[i].length; j++) {
if (x[i][j] == 1) {
rowCount++;
}
if(rowCount > 1) {
count++;
break;
}
}
}
// returns true if count of lines containing 1 equals length of array,
// if not, returns false
return count == x.length;
}
答案 1 :(得分:0)
通过改进您的命名约定来开始。您的代码有许多由其内容命名的变量,而不是按它们的使用方式命名。例如:
boolean check = false; // false means no two queens in the same column.
而不是
boolean twoQueensInColumn = false;
和另一个例子
boolean break2 = false;
而不是更合理的
boolean continueLooking = true;
另外,避免使用变量作为循环转义逻辑的占位符是一个非常好的主意。例如,两个节
...
if (count > 1) {
break2 = true;
check = true;
break;
}
}
if (break2) {
break;
}
是臭虫的滋生地,需要大量的调试才能确保它们正常工作#34;现在&#34;只要修改代码就会中断。更好的是
boolean keepLooking = false;
for (int row = 0; keepLooking && (row < board.length); row++) {
int queensInColumn = 0;
for (int column = 0; keepLooking && (column < board[row].length, column++) {
if (board[row][column] != 0) {
queensInColumn++;
}
if (queensInColumn > 1) {
keepLooking = false;
}
}
}
控制逻辑的主要区别在于循环&#34;条件&#34;块,它所属的地方。
答案 2 :(得分:-1)
我建议将整数转换为字符串并使用.contains()方法并循环遍历。这将使代码更容易理解。