eightqueen again

qiyudong 2009-08-03 11:30:15
小弟我第一次接触回溯法,花了大半天,才把伪代码翻译成c语言,还不太懂.我现在的问题是为什么 j 必须定义为局部变量,全局变量为什么就错了.全局时,在用他之前不也初始化了吗( for(j=0;j<8;j++) )?还有回溯是深度优先还是广度优先?
#include<stdio.h>
int store[8],line[8],z[15],f[15];
int count;
int i;
void print()
{
int k;
for(k=0;k<8;k++)
printf("%d ",store[k]);
printf("\n");
count++;
}
void try(int i)
{
int j;
for(j=0;j<8;j++)
if(line[j]==0&&f[i+j]==0&&z[i-j+7]==0)
{
line[j]=1;z[i-j+7]=1;f[i+j]=1;store[i]=j;
if(i<7)
try(i+1);
else print();
line[j]=0;z[i-j+7]=0;f[i+j]=0;
}
}
main()
{
try(0);
printf("total:%d",count);
system("pause");
}


...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjw6861982 2009-08-03
  • 打赏
  • 举报
回复
楼主是想使用回溯解决8皇后问题。

回溯一般使用深度优先的策略。
zjw6861982 2009-08-03
  • 打赏
  • 举报
回复
try是一个递归函数.当j 定义为局部变量时,每调用一次try,就分配了一个新的j.
如果定义为全局,那么所有的调用合用一个j,......
正解
logiciel 2009-08-03
  • 打赏
  • 举报
回复
try是一个递归函数.当j 定义为局部变量时,每调用一次try,就分配了一个新的j.如果定义为全局,那么所有的调用合用一个j,那样达不到递归的目的,产生不了正确结果.
abcdef0966 2009-08-03
  • 打赏
  • 举报
回复
连个题都没有,实现什么功能也不说
bxl1989 2009-08-03
  • 打赏
  • 举报
回复
有些东西,用递归容易理解。而且必须用递归。
jsxdihao 2009-08-03
  • 打赏
  • 举报
回复
递归还是少弄的好,很容易就晕了~
abcdef0966 2009-08-03
  • 打赏
  • 举报
回复
o ,明白了
对递归老是一知半解
谢谢mstlq
mstlq 2009-08-03
  • 打赏
  • 举报
回复
请看注释

#include <stdio.h>
int store[8],line[8],z[15],f[15];
int count;
int i;
void print()
{
int k;
for(k=0;k <8;k++)
printf("%d ",store[k]);
printf("\n");
count++;
}
void try(int i)
{
int j;
for(j=0;j <8;j++)
if(line[j]==0&&f[i+j]==0&&z[i-j+7]==0)
{
line[j]=1;z[i-j+7]=1;f[i+j]=1;store[i]=j;
//打个比方,假设运行到这里时,你这个函数里面的j=5 ^_^
if(i <7)
try(i+1);
//如果j是局部变量,执行完上面一句的时候,你这个函数里面的j还是等于5
//但是如果你的j是全局变量,那么运行到这里j必定等于8,因为try(i+1)函数将j改成8了,这样搞自然不合逻辑……
else print();
line[j]=0;z[i-j+7]=0;f[i+j]=0;
}
}
main()
{
try(0);
printf("total:%d",count);
system("pause");
}
qiyudong 2009-08-03
  • 打赏
  • 举报
回复
abcdef0966,你在啊?
abcdef0966 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 logiciel 的回复:]
try是一个递归函数.当j 定义为局部变量时,每调用一次try,就分配了一个新的j.如果定义为全局,那么所有的调用合用一个j,那样达不到递归的目的,产生不了正确结果.
[/Quote]

不懂……
循环for(j=0;j <8;j++)
里不是给j重新复制了吗?

劳烦多解释下好吗
qiyudong 2009-08-03
  • 打赏
  • 举报
回复
谢谢,谢谢大家。
abcdef0966,不好意思,我想解决的是8皇后问题。
logiciel,张琎韡,谢谢你们的回答,让我的见解又加深了一点。

69,371

社区成员

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

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