gpt4 book ai didi

c - N Queens Puzzle - 此解决方案中的回溯在哪里?

转载 作者:太空狗 更新时间:2023-10-29 15:32:09 26 4
gpt4 key购买 nike

在研究众所周知的N Queens puzzle ,我遇到了this在 C 中直接且易于理解的实现:

#include<stdio.h>
#include<math.h>

int board[20],count;

int main()
{
int n,i,j;
void queen(int row,int n);

printf(" - N Queens Problem Using Backtracking -");
printf("\n\nEnter number of Queens:");
scanf("%d",&n);
queen(1,n);
return 0;
}

//function for printing the solution
void print(int n)
{
int i,j;
printf("\n\nSolution %d:\n\n",++count);

for(i=1;i<=n;++i)
printf("\t%d",i);

for(i=1;i<=n;++i)
{
printf("\n\n%d",i);
for(j=1;j<=n;++j) //for nxn board
{
if(board[i]==j)
printf("\tQ"); //queen at i,j position
else
printf("\t-"); //empty slot
}
}
}

/*funtion to check conflicts
If no conflict for desired postion returns 1 otherwise returns 0*/
int place(int row,int column)
{
int i;
for(i=1;i<=row-1;++i)
{
//checking column and digonal conflicts
if(board[i]==column)
return 0;
else
if(abs(board[i]-column)==abs(i-row))
return 0;
}

return 1; //no conflicts
}

//function to check for proper positioning of queen
void queen(int row,int n)
{
int column;
for(column=1;column<=n;++column)
{
if(place(row,column))
{
board[row]=column; //no conflicts so place queen
if(row==n) //dead end
print(n); //printing the board configuration
else //try queen with next position
queen(row+1,n);
}
}
}

然而,尽管大部分内容在我看来都是正确的,但我看不到其中的回溯。我错过了什么?

在我看来,在 queen() 函数中,应该在 for 循环之后进行检查,以查看该特定行的搜索是否耗尽但没有成功/queen,如果是这样,通过简单地用 row-1 调用自己来回溯。这个假设是否正确?

最佳答案

让我们深入了解这段代码:

void queen(int row,int n)
{
int column;
for(column=1;column<=n;++column)
{
if(place(row,column))
{
board[row]=column; //no conflicts so place queen
if(row==n) //dead end
print(n); //printing the board configuration
else //try queen with next position
queen(row+1,n);
}
}
}

是的,它是回溯。因为它会尝试所有可能的候选解决方案,直到达到某个完成条件。在一些row值,for(column=1;column<=n;++column)将确保尝试 column 的所有可能值并检查它是否可行 place(row,column) ,然后深入到 row +1。完成后,该算法将继续下一列。

换句话说,这个算法将打印所有可能的解决方案,n -女王。

关于c - N Queens Puzzle - 此解决方案中的回溯在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33886907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com