坦率地说,我可能对此考虑过多,但是如果您有一个boolean[8][8]
数组,并且其中有一个true值,那么如何将所有水平,垂直和对角线值也设为true?
例如,给定[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;}
}
}
}
最佳答案
首先,在循环中,一旦找到第一个真值,就需要一个break变量。我建议布尔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,没有加上,因为对角线指向相反的方向。可以通过在位置上玩或将我的算法画出来来找到关于起始位置和运动的确切逻辑。
例如。
放置(请注意,我添加了变量以确保在找到一个真实值后停止):
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;
}
}
}
关于java - 二维 boolean 数组垂直,水平和对角线分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43773021/