8皇后问题求解。关于全局变量有点迷惑。

aimsam 2010-06-10 10:12:07
这个程序我也是半抄半写的整出来了。遇到了一个无解的问题。

代码
#include <stdio.h>
#define N 8

int sum = 0;
int nRowQ[N] = {0}, LeftTopRightDown[2*N - 1] = {0}, RightTopLeftDown[2*N - 1] = {0};
int nAns[N][2];

void SearchRow(int nLine)
{
int nRow = 0;


for (; nRow < N; nRow++)
{
if(0 == nRowQ[nRow] && 0 == LeftTopRightDown[nLine - nRow + N - 1] && 0 == RightTopLeftDown[nLine + nRow + N - 1])//如果左上右上都有空的话占用这个位置。
{
nRowQ[nRow] = 1;
LeftTopRightDown[nLine - nRow + N - 1] = 1;
RightTopLeftDown[nLine + nRow + N - 1] = 1;//1表示格子被占了。
nAns[nLine][0] = (nLine + 1);//记录下答案。
nAns[nLine][1] = (nRow + 1);
if ((N - 1) > nLine)
{
SearchRow(nLine + 1);//如果不是最后一个就查找下一列
nRowQ[nRow] = 0;//如果查找失败则需要清空前面的结果。
LeftTopRightDown[nLine - nRow + N - 1] = 0;
RightTopLeftDown[nLine + nRow + N - 1] = 0;
}
else
{
int i;
++sum;//总数+1
printf("%d\n", sum);
for (i = 0;i < N; i++)
{
printf("(%d,%d)", nAns[i][0], nAns[i][1]);
}
printf("\n");
nRowQ[nRow] = 0;
LeftTopRightDown[nLine - nRow + N - 1] = 0;
RightTopLeftDown[nLine + nRow + N - 1] = 0;//找到一组解应该清空
}
}
}

}

void Search()
{
int nLine = 0;
SearchRow(nLine);
return ;
}

int main()
{
Search();
printf("\n一共%d种", sum);
return 0;
}





这个代码是能正确运行的,
但是一旦我把开头的int nAns[N][2];这句存储答案坐标的加个初始化int nAns[N][2]={0};就会出问题了。只显示有0种可能。这是怎么回事呢,太纠结了。。。



这个貌似是低级错误啊,因为很少用全局变量所以以前也没遇到过,但是貌似我不懂。

楼下大哥轻松帮我解决下。
...全文
133 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aimsam 2010-06-11
  • 打赏
  • 举报
回复
oh。no依然无解答。。。
改天重新开帖咯。
ForestDB 2010-06-11
  • 打赏
  • 举报
回复
帮顶。
aimsam 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wade_2003 的回复:]
你可以试试用memset()函数初始化,在main()函数中进行初始化试试
[/Quote]

其实这个数组不初始化也可以。就是不知道为什么初始化的话结果就不对了。。。

还有就是为什么换个定义的位置就也对了。。是BUG?
wade_2003 2010-06-11
  • 打赏
  • 举报
回复
你可以试试用memset()函数初始化,在main()函数中进行初始化试试
aimsam 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liao05050075 的回复:]
这个问题确实很奇怪。我也想不明白。
刚刚试了一下,如果把int nAns[N][2]={0};这句放到int nRowQ[N] = {0}, LeftTopRightDown[2*N - 1] = {0}, RightTopLeftDown[2*N - 1] = {0};上面,结果又是对的。。
[/Quote]

这样啊。。这个比较奇特。
aimsam 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z569362161 的回复:]
全局变量是静态的,你改变不了他的值
[/Quote]

那是不是说不能初始化全局变量数组?
我好像没有相关知识,希望能举个例子什么的。。
filec75 2010-06-11
  • 打赏
  • 举报
回复
ding
jldream110 2010-06-11
  • 打赏
  • 举报
回复
迷糊 。。。
z569362161 2010-06-10
  • 打赏
  • 举报
回复
全局变量是静态的,你改变不了他的值
liao05050075 2010-06-10
  • 打赏
  • 举报
回复
这个问题确实很奇怪。我也想不明白。
刚刚试了一下,如果把int nAns[N][2]={0};这句放到int nRowQ[N] = {0}, LeftTopRightDown[2*N - 1] = {0}, RightTopLeftDown[2*N - 1] = {0};上面,结果又是对的。。
aimsam 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 z569362161 的回复:]
C/C++ code
#include<stdio.h>
int queen[8],b[8],c[15],d[15];
int sum=0;
void display()
{
int k;
printf("%d:",sum++);
for(k=0;k<8;k++)
printf(" %d",queen[k]);
printf("\n");
}


v……
[/Quote]

呵呵。。其实我不是问8皇后算法的。。。我是来问数组初始化的。。
z569362161 2010-06-10
  • 打赏
  • 举报
回复
#include<stdio.h>
int queen[8],b[8],c[15],d[15];
int sum=0;
void display()
{
int k;
printf("%d:",sum++);
for(k=0;k<8;k++)
printf(" %d",queen[k]);
printf("\n");
}


void ptry(int i)
{
int j; /*每个皇后都有8个可能位置*/
for(j=0;j<8;j++)
{
if(b[j]==0&&c[i+j]==0&&d[i-j+7]==0)/*判断位置是否冲突*/
{
queen[i]=j; /*摆放皇后*/
b[j]=1; /*宣布占领第j行*/
c[i+j]=1; /*占领两个对角线*/
d[i-j+7]=1;
if(i<7) __________________多了个';' /*8个皇后没有摆完,递归摆放下一个皇后*/
ptry(i+1);
else
display(); /*完成任务,打印结果*/
b[j]=0; /*回溯*/
c[i+j]=0;
d[i-j+7]=0;
}
}
}

void main()
{
int k;
for(k=0;k<8;k++)
{
b[k]=0;
c[k]=0;
d[k]=0;
}
ptry(0);
getch();
}


没时间看,给你一个以前的,也是这个,你在研究一下。
我要下了

70,023

社区成员

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

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