搜索与回溯算法:八皇后问题

雨燕双飞 提交于 2019-11-29 18:22:22

1213:八皇后问题


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

【题目描述】

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

【输入】

(无)

【输出】

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

【输入样例】

(无)

【输出样例】

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 
...以下省略

【来源】

i表示行,a[j]=i,表示第i行的第j个数

#include<iostream>
using namespace std;
int a[10001],b[10001],w[10001],m[10001],tot = 0;
int print()
{
	tot++;
	cout << "No. " << tot << endl;
	for(int i = 1; i <= 8; ++i)
	{
		for(int j = 1; j <= 8; ++j)
		{
			if(i == a[j])
				cout << "1" << " ";
			else
				cout << "0" << " ";
		}
		cout << endl;
	}
}
int search(int j)
{
	for(int i = 1; i <= 8; ++i)//搜索可以放的8个位置 
	{
		if(b[i] == 0 && w[i-j+7] == 0 && m[i+j] == 0)//判断条件是否成立 
		{
			a[j] = i;//记录列
			b[i] = 1;//占领列,将占领的列标记为1
			w[i-j+7] = 1;
			m[i+j] = 1;//占领两条对角线 
			if(j == 8) print();
			else search(j+1);//摆放下一个皇后
			b[i] = 0;
			w[i-j+7] = 0;
			m[i+j] = 0; //回溯法,收回上一个放出的皇后 
		}
	}
}
int main()
{
	//freopen("b.txt","w",stdout);
	search(1);
	return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!