超级皇后是一种象棋棋子,可以像皇后一样移动,但也可以像骑士一样移动。在一个8X8的棋盘上,最多可以放置多少个超级皇后,以使得没有一个超级皇后被其他人攻击?
我想编写一个暴力算法来找到最大值。以下是我的代码:
public class Main {
public static boolean chess[][];
public static void main(String[] args) throws java.lang.Exception {
chess = new boolean[8][8];
chess[0][0] = true;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
/*Loop to check various possibilities*/
if (!checkrow(i) && !checkcolumn(j) && !checkdiagonals(i, j) && !checkknight(i, j)) {
if (i != 0 || j != 0) {
chess[i][j] = true;
}
}
}
}/*printing the array*/
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(((chess[i][j]) ? "T" : "x") + "|");
}
System.out.println();
}
}
/*All working fine here*/
public static boolean checkrow(int a) {
for (int i = 0; i < 8; i++) {
if (chess[a][i]) {
return true;
}
}
return false;
}
/*All working fine here*/
public static boolean checkcolumn(int a) {
for (int i = 0; i < 8; i++) {
if (chess[i][a]) {
return true;
}
}
return false;
}
/*All working fine here*/
public static boolean checkdiagonals(int pi, int pj) {
int i = pi - Math.min(pi, pj);
int j = pj - Math.min(pi, pj);
for (int k = i, l = j; k < 8 && l < 8; k++, l++) {
if (chess[k][l]) {
return true;
}
}
int i_2 = pi - Math.min(pi, pj);
int j_2 = pj + Math.min(pi, pj);
for (int k = i_2, l = j_2; k < 8 && l > 1; k++, l--) {
if (chess[k][l]) {
return true;
}
}
return false;
}
/*Not All working fine here try commenting out this method above so that that it doesn't run during the check*/
public static boolean checkknight(int pi, int pj) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (0 <= pi + 2 * i && pi + 2 * i <= 8 && 0 <= pj + j && pj + j <= 8) {
if (chess[pi + 2 * i][pj + j]) {
return true;
}
}
if (0 <= pi + i && pi + i <= 8 && 0 <= pj + 2 * j && pj + 2 * j <= 8) {
if (chess[pi + i][pj + 2 * i]) {
return true;
}
}
}
}
return false;
}
}
我有两个问题:
- 我的checkknight算法查找所有马的位置,这是错误的吗?还是有一些编码错误。当我注释掉它时,一切都正常工作,我得到了一个很好的解决方案。
- 其次,它只会导致一个解决方案。对于其他解决方案,我必须在每个大循环之后逐位偏移(或更改位置)其他部分,我对实现它感到困惑。我的直觉告诉我,我需要改变整个代码。是否有修改或方法可以做到这一点?
其他想法:我认为每次放置一个棋子时,我们应该将计数器加1,并添加到长数组中,并在存储相关数据后输出最大值和数组。
代码位置:您可以在http://ideone.com/gChD8a查看/编辑/派生/下载它。
<=8
看起来有点可疑。它们不应该是<8
吗? - David Eisenstat