八皇后問題(經典算法-回溯法)


問題描述:       

        八皇后問題(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<<"種放法\n";
		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<<"放法\n";
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM