八皇后问题(经典算法-回溯法)

问题描述:       

        八皇后问题(eight queens problem)是十九世纪著名的数学家高斯于1850年提出的。问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击。即任意两个皇后都不能处于同一行、同一列或同一斜线上。

可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能互相攻击。

思路:

        使用回溯法依次假设皇后的位置,当第一个皇后确定后,寻找下一行的皇后位置,当满足左上、右上和正上方向无皇后,即矩阵中对应位置都为0,则可以确定皇后位置,依次判断下一行的皇后位置。当到达第8行时,说明八个皇后安置完毕。

代码如下:

#include<iostream>
using namespace std;
#define N 8
int a[N][N];
int count=0;

//判断是否可放
bool search(int r,int c)
{
	int i,j;
	//左上+正上
	for(i=r,j=c; i>=0 && j>=0; i--,j--)
	{
		if(a[i][j] || a[i][c])
		{
			return false;
		}
	}
	//右上
	for(i=r,j=c; i>=0 && j<N; i--,j++)
	{
		if(a[i][j])
		{
			return false;
		}
	}
	return true;
}

//输出
void print()
{
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			cout<<a[i][j]<<"  ";
		}
		cout<<endl;
	}
}

//回溯法查找适合的放法
void queen(int r)
{
	if(r == 8)
	{
		count++;
		cout<<"第"<<count<<"种放法
";
		print();
		cout<<endl;
		return;
	}
	int i;
	for(i=0; i<N; i++)
	{
		if(search(r,i))
		{
			a[r][i] = 1;
			queen(r+1);
			a[r][i] = 0;
		}
	}
}

//入口
int main()
{
	queen(0);
	cout<<"一共有"<<count<<"放法
";
	return 0;
}

原文地址:https://www.cnblogs.com/zhangguixing/p/10858142.html