八皇后问题 OpenJ_Bailian - 2698

八皇后问题

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

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");
	}
}
扫描二维码关注公众号,回复: 2611736 查看本文章

猜你喜欢

转载自blog.csdn.net/shenyulingyeye/article/details/81355004