1213:八皇后问题

1213:八皇后问题


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 21323     通过数: 7761 

【题目描述】

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

【输入】

(无)

【输出】

按给定顺序和格式输出所有八皇后问题的解(见样例)。

【输入样例】

(无)

【输出样例】

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 
...以下省略
#include<iostream>
using namespace std;
int a[9];//a[i]=j 记录第i行的皇后在j列 
int b[9];//b[j]=1 表示第j列有皇后了,=0表示第j列没有皇后
int qipan[9][9];//记录棋盘中的数字,有皇后的格子数字为1,没有皇后的格子为0 
int ysx[16];//表示从左下到右上的斜线,y=右,s=上,x=斜,总共15条斜线,每条斜线上所有格子 行号+列号=固定值,值范围2至16, 
int yxx[16];//表示从左上到右下的斜线,y=右,x=下,x=斜,总共15条斜线,每条斜线上所有格子 行号-列号=固定值 ,值范围7至-7 
int i,j,sum;//sum记录多少种可能 
void print();
void dfs(int i) //确定第i行皇后位置
{
	int j;
	for(j=1;j<=8;j++)
	{
		if(b[j]==0&&ysx[i+j]==0&&yxx[i-j+7]==0)//1.这一列没有皇后,2.这个点并不在某个皇后覆盖的从左下到右上的斜线上,3. 这个点并不在某个皇后覆盖的从左上到右下的斜线上
		{
			a[i]=j;
			b[j]=1;
			qipan[i][j]=1;
			ysx[i+j]=1;
			yxx[i-j+7]=1;
			if(i==8) 
			{
			//if(sum<3)
				print();
			}	
			else
				dfs(i+1);
			//以下为回溯 
			a[i]=0;
			b[j]=0;
			qipan[i][j]=0;
			ysx[i+j]=0;
			yxx[i-j+7]=0;
		}
	}
	return;
 }
void print()
{
	sum++;
	int m,n;
	cout<<"No. "<<sum<<endl;
	for(m=1;m<=8;m++)
	{
		for(n=1;n<=8;n++)
			{
				if(qipan[n][m]==1)
				cout<<"1"<<" ";
				else
				cout<<"0"<<" ";
			}
		cout<<endl;
	}
	return;
}
int main()
{
	dfs(1);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值