C语言用回溯法解决八皇后问题的疑惑

sslldkfj 2011-09-10 11:10:58
#define N 8/*定义棋盘大小*/
int place(int k);/*确定某一位置皇后放置与否,放置则返回1,反之返回0*/
void backtrack(int i);/*主递归函数,搜索解空间中第i层子树*/
void chessboard();/*每找到一个解,打印当前棋盘状态*/
static int sum,/*当前已找到解的个数*/ x[N];/*记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列*/
int main(void)
{
backtrack(0);
system("pause");
return 0;
}
int place(int k)
{/*测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。x[j]==*/ /*x[k]时,两皇后在同一列上;abs(k-j)==abs(x[j]-x[k])时,两皇*/ /*后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件*/
for(int j=0;j<k;j++)
if(abs(k-j)==abs(x[j]-x[k])||(x[j]==x[k]))
return 0;
return 1;
}
void backtrack(int t)
{
if(t==N)chessboard();/*t==N时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案*/
else
for(int i=0;i<N;i++)
{
x[t]=i;
if(place(t))backtrack(t+1);
}
}

void chessboard()
{
printf("第%d种解法:\n",++sum);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
if(j==x[i]) printf(" @");
else printf(" *");
printf("\n");

}
printf("\n");

}


我的疑惑是这个程序里面是怎么实现回溯的。
调试跟踪发现,在backtrack函数中,如果for里面循环了8次,发现无解,在退出for之后又进入了if(place(t))backtrack(t+1);而且这时参数发生了变化,自动到上一层进行搜索。不知道这中间过程是如何完成的。
请大侠们赐教
...全文
571 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChristopherWu 2011-09-12
  • 打赏
  • 举报
回复
为什么这么多人灌水、、、、、。。。。
qq120848369 2011-09-10
  • 打赏
  • 举报
回复
一行一行的摆旗子,摆的不合适就不摆,所有行都摆完了就赢了。
sslldkfj 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnuqinhuan 的回复:]
画一个矩阵 自己一步一步的跟踪就知道了 就是一个试探法则 合适就往下走 不合适就返回上一层
[/Quote]
你说的我知道,我的问题是从C语言的语法上分析,这个程序是如何执行的,为什么会那样走,程序何时停止,就是想知道这段程序是如何执行的,为什么会那样执行。
無_1024 2011-09-10
  • 打赏
  • 举报
回复
画一个矩阵 自己一步一步的跟踪就知道了 就是一个试探法则 合适就往下走 不合适就返回上一层

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧