询问N皇后解决?

时间:2010-10-15 08:48:33

标签: c++ depth-first-search n-queens

我解决了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);
          }
      }  
  } 

1 个答案:

答案 0 :(得分:4)

嗯,一旦有了解决方案,您只能检查一个独特的解决方案。要检查的地方是您增加count变量的点。此时,将当前电路板与一组独特电路板进行比较,如果它不在集合中,则将新解决方案添加到其中。

至于你的速度,你的解决方案在推送和弹出state值时会遇到瓶颈。电路板越大,变得越慢。

更快的方法是只有一块电路板并让每个方格都保持计数控制该方块的皇后数量。所以你有这个:

function scan (column)
   if column == number of columns (zero based index)
     check solution
   else
     if there's a free space
       add queen
       increment controlled squares in columns to right of current column
       scan (column+1)
       decrement controlled squares in columns to right of current column
       remove queen

推送/弹出的数据少得多,并且会大大提高速度。