老实说,我可能会过度思考这个问题,但是如果你有一个boolean[8][8]
数组且值为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;}
}
}
}
答案 0 :(得分:2)
首先,在循环中,一旦找到第一个真值,就需要一个中断变量。我建议将boolean 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;
}
}
}
答案 1 :(得分: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
答案 2 :(得分: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