C语言八皇后问题,解释代码是什么意思。尤其是加了问号的地方什么意思。有问号的地方解释一下,我要理解

#include<stdio.h>#defineN8intcolumn[N+1];//同栏是否有皇后,1表示有intrup[2*N+1];//右上至左下是否有皇后,1表示... #include<stdio.h>
#define N 8
int column[N+1]; //同栏是否有皇后,1表示有
int rup[2*N+1]; //右上至左下是否有皇后,1表示有
int lup[2*N+1]; //左上至右下是否有皇后,1表示有
int queen[N+1]={0}; //????
int num; //Case编号
void backtrack(int i); //递回求解
void main()
{
int i;
num=0;
for(i=1;i<=N;i++)
column[i]=1; //????
for(i=1;i<=2*N;i++)
rup[i]=lup[i]=1; //????
backtrack(1); //重新寻找符合要求的位置
}
void showAnswer() //输出结果
{
int x,y;
printf("\nCase %d\n",++num);
for(y=1;y<=N;y++)
{
for(x=1;x<=N;x++)
{
if(queen[y]==x) //?????????????
{
printf("■");//■表示皇后,输出时为白色方框
}
else
{
printf("□");
}
}
printf("\n");
}
}
void backtrack(int i) //递回求解
{
int j;
if(i>N) //不再回溯 //???????
{
showAnswer();
}
else
{
for(j=1;j<=N;j++)
{
if(column[j]==1 && rup[i+j]==1 && lup[i-j+N]==1) //?????????
{
queen[i]=j; //设为占用 //???????????
column[j]=rup[i+j]=lup[i-j+N]=0; //??????
backtrack(i+1); //????????
column[j]=rup[i+j]=lup[i-j+N]=1; //??????????
}
}
}
}
展开
 我来答
laobaitu0322
2014-12-31 · TA获得超过744个赞
知道小有建树答主
回答量:900
采纳率:33%
帮助的人:635万
展开全部
#include<stdio.h>
#define N 8
int column[N+1];  //同栏是否有皇后,1表示有
int rup[2*N+1];  //右上至左下是否有皇后,1表示有
int lup[2*N+1];  //左上至右下是否有皇后,1表示有
int queen[N+1]={0};           //????  用来记录第i行的皇后放在第几个位置
int num;  //Case编号
void backtrack(int i);  //递回求解
void main()
{
int i;
num=0;
for(i=1;i<=N;i++)
column[i]=1;         //????    column  rup  lup都是标记竖列,斜排是否能放皇后的,初始化为1,表示开始的时候所有位置都可以放
for(i=1;i<=2*N;i++)
rup[i]=lup[i]=1;              //????  同上
backtrack(1);  //重新寻找符合要求的位置
}
void showAnswer()  //输出结果
{
int x,y;
printf("\nCase %d\n",++num);
for(y=1;y<=N;y++)
{
for(x=1;x<=N;x++)
{
if(queen[y]==x)                      //?????????????   按每行每个位置输出,如果该位置是皇后就输出黑框,否则就是白框
{
printf("*");//■表示皇后,输出时为白色方框
}
else
{
printf(".");
}
}
printf("\n");
}
}
void backtrack(int i)  //递回求解
{
int j;
if(i>N)  //不再回溯                              //???????   递归结束条件,i如果能够走到8以上,说明前面8行都已经填上皇后,就是一个解,去输出
{
showAnswer();
}
else
{
for(j=1;j<=N;j++)
{
if(column[j]==1 && rup[i+j]==1 && lup[i-j+N]==1)         //?????????   表示第i行第j位置能够放皇后
{
queen[i]=j;  //设为占用                                  //???????????                              把第i行的皇后放在j位置
column[j]=rup[i+j]=lup[i-j+N]=0;              //??????                              把i,j位置所在的竖列和斜排的标记设为不能放皇后了
backtrack(i+1);                                      //????????      递归寻找i+1行 能放皇后的位置
column[j]=rup[i+j]=lup[i-j+N]=1;         //??????????                         递归结束回来之后要把标记重新设回可以放,进行下一次搜索
}
}
}
}
更多追问追答
追问
1这句是数组的初始化吗?int queen[N+1]={0}; 表示queen数组全部为0吗?2还有这句意思是if(queen[y]==x) 如果哪个位置等于x则输出黑框?3。if(i>N)这句可以改成i=8吗,因为最多8行怎么会超过8?4queen[i]=j;  如果把皇后放在第i行的第j个位置?不是用这句表示可以放皇后吗?column[j]=rup[i+j]=lup[i-j+N]=1;
追答

1.int queen[N+1]={0}是把数组全初始化为0,只有声明的时候可以这么初始化,并且只能初始化为0

2.x是从1到N变化的,queen[y]的值代表了第y行皇后的位置(在1到N之间),这个循环就是输出整个棋盘了

3.不能,你写i==8那么就还没有判断第八行能不能放皇后,这个行数的增加是backtrack(i+1);这句递归来控制的,i==8的时候要判断一下,最后调用backtrack(9);才行,这时候i>8

4.这三个数组是用来记状态的,现在假设i,j的位置放了皇后,如图 i=4,j=3

那么这些黑线经过的位置就不能再放皇后了,记录这些格子的状态的数组就是column  rup  lup

比如column[3]=0,表示这一列全都不能再放皇后了

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式