八皇后问题
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
Input
无输入。
Output
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
Sample Input
Sample Output
No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 No. 3 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 No. 4 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 No. 5 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 No. 6 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 No. 7 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 No. 8 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 No. 9 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 ...以下省略
Hint
此题可使用函数递归调用的方法求解。
这个问题的输出格式是 行列互换。AC
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 8
typedef struct
{
int queen[max];
int top;
}sqstack;
sqstack *s;
int num=0;
void push(int i);
void pop();
void search();
bool check();
void show();
int main()
{
s=(sqstack*)malloc(sizeof(sqstack));
s->top=-1;
search();
free(s);
return 0;
}
bool check()
{
for(int i=0;i<s->top;i++)
if(s->queen[i]==s->queen[s->top]||fabs(s->queen[i]-s->queen[s->top])==s->top-i)//行差==列差就是对角线
return false;
return true;
}
void search()
{
for(int i=0;i<max;i++)//i就是列,0-7穷举
{
push(i);//进栈
if(check())// 符合条件,继续下一个皇后
{
if(s->top==max-1)
show();
else
search();
}
pop();//进栈后出栈,下一组
}
}
void push(int i)//这是简化版,不用在意
{
s->top++;
s->queen[s->top]=i;
}
void pop()
{
s->top--;
}
void show()
{
int i,j;
num++;
printf("No. %d\n",num);
for(j=0;j<max;j++)
{
for(i=0;i<max;i++)
{
if(j==s->queen[i])//这个问题中行列互换,所以s->queen[]中由原来的存 列 换成 行,这里输出改为同行输出就可以了
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
}