【发布时间】:2018-12-03 07:51:46
【问题描述】:
我正在尝试编写一个函数来获得一个 MxN 大小的板,其中有一列和一行放置一个皇后。然后我想看看那个女王是否受到威胁。 通常我会拿那行并检查它是否有任何其他皇后,对于列和对角线使用 for 循环也是如此。 但是这里有一个细微的变化,棋盘上还有一些墙可以保证皇后的安全,即使同一行还有另一个皇后:
* * Q X * Q
* * X * * *
* Q X X Q *
Q * X Q Q *
其中 Q 是皇后,X 是墙,* 是空瓷砖。 位于 0,2 位置的皇后不会受到威胁,即使该行还有另一个。
整个棋盘也保存在一个二维数组中,其中皇后的 int 值为 1,墙为 -1,空白为 0。
我的想法是遍历整个行,如果某处有一个皇后,那么我应该寻找一堵墙,从那个位置到我正在看的皇后有另一个 for 循环。但是在我的女王之后还有第二部分。
我尝试考虑求和,但也不太奏效.. 有人对如何实现这一点有任何想法吗? (如果受到威胁,则返回 true;如果没有受到威胁,则返回 false;)
编辑:这是我的代码
`public static boolean isQueenThreatened(int[][] board, int row, int col){
boolean safe=true;
for(int j = 0; j < col & safe ; j++){
if(board[row][j]==1) {
for (int i = j+1 ; i<col ; i++ ) {
if(board[row][i]!=-1) safe = false;
}
}
}
for(int j = col+1; j < board[row].length & safe ; j++){
if(board[row][j]==1) {
for (int i = j+1 ; i<board[row].length ; i++ ) {
if(board[row][i]!=-1) safe = false;
}
}
}
return safe;
}`
所以函数获取了皇后的位置(假设它是有效的),然后我想遍历那一排直到我的皇后和之后,看看是否有其他皇后,如果有我想检查是否有它们之间的墙是为了保证我的女王的安全,显然我的不起作用,因为如果它们之间只有一堵墙,它会给出错误的结果,只有一堵墙就足够了,不一定是所有的墙。
* Q * * X Q' * X Q
我用'表示我的女王,我的代码会为那个例子返回假,即使它应该是真的..然后我必须对对角线和列做同样的事情..这就是我需要的地方帮助。
【问题讨论】:
-
您有问题吗?
-
是的。如果有任何想法如何使我的想法发挥作用?如何有效地越过这一行,看看女王是否受到威胁,因为我不能仅仅决定它的右边是否有墙是安全的,因为它的左边可能有一个女王,或者根本没有女王而且没有墙,而且它仍然是安全的
-
如果您显示您正在尝试的代码以及哪里出了问题,您会更好地得到答案。
-
我已经添加了我的代码