主文件
counter = 1;
n = 8;
board = zeros(1,n);
back(0, board);
disp(counter);
解决方案
function value = sol(board)
for ( i = 1:(length(board)))
for ( j = (i+1): (length(board)-1))
if (board(i) == board(j))
value = 0;
return;
end
if ((board(i) - board(j)) == (i-j))
value = 0;
return;
end
if ((board(i) - board(j)) == (j-i))
value = 0;
return;
end
end
end
value = 1;
return;
返回.m
function back(depth, board)
disp(board);
if ( (depth == length(board)) && (sol2(board) == 1))
counter = counter + 1;
end
if ( depth < length(board))
for ( i = 0:length(board))
board(1,depth+1) = i;
depth = depth + 1;
solv2(depth, board);
end
end
我正在尝试找到可以将 n-queen 放置在 n×n 板上的最大方式,以使这些皇后不会互相攻击。我无法弄清楚上述matlab代码的问题,我怀疑这是我的逻辑的问题,因为我已经在java中测试了这个逻辑并且它似乎在那里工作得很好。代码可以编译,但问题是它产生的结果是错误的。
有效的Java代码:
public static int counter=0;
public static boolean isSolution(final int[] board){
for (int i = 0; i < board.length; i++) {
for (int j = i + 1; j < board.length; j++) {
if (board[i] == board[j]) return false;
if (board[i]-board[j] == i-j) return false;
if (board[i]-board[j] == j-i) return false;
}
}
return true;
}
public static void solve(int depth, int[] board){
if (depth == board.length && isSolution(board)) {
counter++;
}
if (depth < board.length) { // try all positions of the next row
for (int i = 0; i < board.length; i++) {
board[depth] = i;
solve(depth + 1, board);
}
}
}
public static void main(String[] args){
int n = 8;
solve(0, new int[n]);
System.out.println(counter);
}