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; //??????????
}
}
}
} 展开
#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; //??????????
}
}
}
} 展开
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}; //???? 用来记录第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,表示这一列全都不能再放皇后了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询