N皇后問題(簡要版)

八皇后問題是經典題目,無需贅述

樣例輸入1
6
樣例輸出1
* Q * * * * 
* * * Q * * 
* * * * * Q 
Q * * * * * 
* * Q * * * 
* * * * Q * 

* * Q * * * 
* * * * * Q 
* Q * * * * 
* * * * Q * 
Q * * * * * 
* * * Q * * 

* * * Q * * 
Q * * * * * 
* * * * Q * 
* Q * * * * 
* * * * * Q 
* * Q * * * 

* * * * Q * 
* * Q * * * 
Q * * * * * 
* * * * * Q 
* * * Q * * 
* Q * * * * 

Total have 4 times.
樣例輸入2
8
樣例輸出2
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 

Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 

Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
* * Q * * * * * 

Total have 92 times.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N = 30;
int map[N][N];
bool vis_line[N],vis_row[N],vis_left[N],vis_right[N];
int times,n;
void print(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(map[i][j]==1){
				cout<<"Q ";
			}
			else cout<<"* ";
		}
		cout<<endl;
	}
	cout<<endl;
	return;
}
void search(int num){
	if(num<=n){
		for(int j=1;j<=n;j++){
			if((vis_line[num]==false)&&(vis_row[j]==false)&&(vis_left[num-j+20]==false)&&(vis_right[num+j]==false)){
				map[num][j]=1;
				vis_line[num]=true;
				vis_row[j]=true;
				vis_left[num-j+20]=true;
				vis_right[num+j]=true;
				search(num+1);
				map[num][j]=0;
				vis_line[num]=false;
				vis_row[j]=false;
				vis_left[num-j+20]=false;
				vis_right[num+j]=false;
			}
		}

	}
	else if(num>n){
		times++;
		print();
		return;
	}
}
int main()
{
	cin>>n;
	search(1);
	cout<<"Total have "<<times<<" times.";
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章