我已经解决了更通用的N Queens问题,但现在我正在寻找一种算法来解决N Queens Domination问题。
“给定一个n×n板,找到控制号码,这是攻击或占据每个方格所需的最小皇后(或其他部分)。对于8×8板,女王的统治号码为5。 “ - 维基百科
我已经进行了广泛的搜索,除了关于这个问题的学术论文之外什么都找不到,没有什么是可以理解的。
我的第一个想法是放下一个女王,然后将下一个女王放在可以攻击其他大多数方块的地方,依此类推。然而,虽然这可能会产生一个解决方案,但我无法找到一种方法来保证该解决方案是最小的解决方案。
任何帮助都将不胜感激,谢谢。
答案 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;
}