解决N皇后控制难题的算法

时间:2012-02-04 23:25:17

标签: algorithm puzzle chess

我已经解决了更通用的N Queens问题,但现在我正在寻找一种算法来解决N Queens Domination问题。

  
    

“给定一个n×n板,找到控制号码,这是攻击或占据每个方格所需的最小皇后(或其他部分)。对于8×8板,女王的统治号码为5。 “ - 维基百科

  

我已经进行了广泛的搜索,除了关于这个问题的学术论文之外什么都找不到,没有什么是可以理解的。

我的第一个想法是放下一个女王,然后将下一个女王放在可以攻击其他大多数方块的地方,依此类推。然而,虽然这可能会产生一个解决方案,但我无法找到一种方法来保证该解决方案是最小的解决方案。

任何帮助都将不胜感激,谢谢。

4 个答案:

答案 0 :(得分:3)

使用您的算法,您可以生成所有可能的组合并从中获取最小值。 提示:对此使用递归,并且不处理类似的条件(或缓存它),如对称放置,相同的顺序等。

答案 1 :(得分:1)

本着这是一个家庭作业问题的精神,我不会提供解决方案,而是提供一系列导致解决方案的问题。以下是一种回答“你能用n皇后主宰董事会吗?”的方法然后,您可以通过测试n = 1,n = 2,...

来找到统治编号

1)通过将女王放置在1 *的位置,你可以通过将(n - 1)个皇后放置在(2,3,...中选择的(n - 1)个位置来控制女王1未达到的所有剩余位置。 。)?

2)如果没有,你可以将女王放在第2位,然后通过将(n - 1)个女王放入(n - 1)个位置(3,4)中来控制女王1未达到的所有剩余位置...)?

3)依此类推......即将第一位女王放在第3位,然后放在第4位,等等。

请注意,这个解决方案是递归的 - 在每次递归时,“添加一个女王的剩余位置”和“任何女王尚未到达的位置”作为参数传递。当“任何女王尚未到达的位置”为空时,您已找到解决方案。

*以某种方式订购所有董事会职位,例如从左到右,从上到下。因此,8x8电路板上的64个位置只能通过索引(1..64)来引用。

答案 2 :(得分:0)

以下效率不高,但可行。

将问题重新表述为整数编程问题。棋盘上的每个方格都是0或1.对于任何方格,其自身和所有攻击方格的总和应该恰好为1.并且您希望最小化总和。

答案 3 :(得分:0)

int count;

int safetyOfThisPosition(int col,int row,int *x)

{

       int iterator;
       for(iterator=0;iterator<col;iterator++)
       {
        if(row==x[iterator] || abs(col-iterator)==abs(row-x[iterator]))
           return 0;
       }
       return 1;
}

void Nqueen(int col){

       int row,iterator;
       static int x[N];  
       for(row=0;row<N;row++)  
       {
           if(safetyOfThisPosition(col,row,x))
           {
               x[col]=row;
               if(col==N-1)
               {
                   for(iterator=0;iterator<=col;iterator++)
               printf("%d  ",x[iterator]);
                   printf("\n");
               }
               else
                   Nqueen(col+1);
           }
       }

   }

int main(){

       Nqueen(0);
       return 0;
   }