问题描述
输出8皇后问题所有结果。
输入
没有输入
输出
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。
输入样例
输出样例
代码如下;
# include <stdio.h>
#define N 8
#define false 0
#define true 1
int cnt;//存放解决方案数
int q[10]={0};//存放每个皇后的位置信息,初始化为0
void queen(int k);
int check(int k, int col);//检查将皇后K放在每一行的col位置是否可行
void print();//打印每组解
int abs(int n);
int main()
{
search_time=0;
cnt=0;
queen(1);//从第一个皇后开始检索
return 0;
}
void queen(int k)
{
int i;
if(k==N+1)//N+1表示最后的皇后存放的位置也是合法的
{
cnt++;//解决方案数+1
print();
return ;//返回上一层,回到i-1,即上一个皇后的状态
}
for(i=1;i<=N;i++)//依次判断每一行的每个位置是否合法
if(check(k,i))
{
q[k]=i;//合法,则将此时的位置信息存放在数组q[]中
queen(k+1);//检索下一个皇后
q[k]=0;//恢复状态
}
}
int check(int k, int col)
{
int i;
for(i=1;i<=k;i++)//当前皇后的位置信息依次与前面的皇后进行比对
if(abs(k-i)==abs(col-q[i])||col==q[i])//斜对角应用等腰三角形的特征
return false;
return true;
}
void print()
{
int i,j;
printf("No %d:\n",cnt);
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(q[i]==j)
printf("A");
else printf(".");
}
printf("\n");
}
}
int abs(int n)
{
if(n<0)
return -n;
else return n;
}
总结:
- 一个好习惯:把所有函数申明放在开头。
- 此题虽然最后的输出看起来是二维数组形式,但是,如果此题采用的是用一个一维数组q[ ],来存储皇后的位置。实际上,每得到一组解时,数组q[ ]就是一串由1~8组成的数,这个数上的第i位数j就代表着i皇后所处的第i行的第j列。以示例的第一个输出为例,此时数组q[ ]就是{1、5、8、6、3、7、2、4}。
- 本题对格式的控制较严格,例如:每行输出的最后不能带空格、No x:处的空格、数字、冒号等都得注意。