我解决了 N-Queen 问题,条件是每列只能有一个皇后。所以我把一个皇后放在第一列的一个方格中,然后移动到下一列,把一个皇后放在船上没有被皇后攻击的方格中。我可以使用这种方法找到所有解决方案,但是在 n=13 之后开始需要很长时间。此外,我发现该问题的大多数解决方案都可以通过旋转和反射极少数不同的解决方案来找到。例如,8 个皇后问题有 92 个总解决方案,其中只有 12 个是不同的。(http://en.wikipedia.org/wiki/Eight_queens_puzzle)
所以我的问题是我如何检查电路板的这些状态,并且只将这些状态推送到堆栈中,从而给出不同的解决方案?
这就是我现在正在做的事情。
typedef struct state{
int board[N][N];
int col;
}state;
state cur;
state next;
stack<state> myS;
myS.push(emptyBoard);
while(!myS.empty()){
cur=myS.top(); myS.pop();
if(cur.col==n){
count++;
continue;
}
for(i=0;i<n;i++){
next=cur;
if(cur.board[i][cur.col]==available){
next.board[i][cur.col]=occupied;
markConflicts(i,cur.col); //mark squares attacked by queen as conflicted
next.col=cur.col+1;
myS.push(next);
}
}
}