#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool Map[100][100];
int N,num;
string Display()\\将结果转换为string提高显示流畅(可直接显示)
{
string s="";
s.append("-------------------------MAP--------------------------\n");
for(int i=0;i<N;++i)
{
for(int t=0;t<N;++t)
{
if(Map[i][t])
s.append("* ");
else
{
s.append(". ");
}
}
s.append("\n");
}
return s;
}
bool chack(int i,int t)\\检查当前点是否可行
{
int x_n=0,y_n=0;
int l_x=0,l_y=0;
for(int x=0;x<N;++x)
{
//行列检查
if(Map[i][x])
x_n+=1;
if(Map[x][t])
y_n+=1;
//对角线检查
if(x+(t-i)>=0&&x+(t-i)<N)
if(Map[x][x+(t-i)])
l_x+=1;
if(t+i-x>=0&&t+i-x<N)
if(Map[x][t+i-x])
l_y+=1;
if(x_n>1||y_n>1||l_x>1||l_y>1)
{
return 0;
}
}
return 1;
}
void N_King(int n)//回溯查找
{
if(n==N)
{
num+=1;
printf("第%d种方法\n",num);
cout<<Display();
return;
}
for(int t=0;t<N;++t)
{
if(Map[n][t]==0)
{
Map[n][t]=1;
if(chack(n,t))
N_King(n+1);
Map[n][t]=0;//回溯
}
}
}
void get_map()//初始化棋盘
{
num=0;
for(int i=0;i<N;++i)
{
for(int t=0;t<N;++t)
{
Map[i][t]=0;
}
}
}
int main()
{
cin>>N;
get_map();
N_King(0);
system("pause");
}
N 皇后问题
最新推荐文章于 2024-04-18 08:15:00 发布