基于八皇后问题
思路:单看一个皇后的话,其实是一个全排列问题(类似于1到n这些数字组合成的排列有哪些),首先得一行一行的排,且每次排都在不同列,(每次进行一次全排列,后面的数字不能和前面的相同),也就是说我们就不需要再注意行之间是否会相同,只需要注意对角线和列是否会相同,然后就是先排黑或白,在排另一种棋,简化题目。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<sstream>
#include<math.h>
using namespace std;
int n;
int vis[9][9]={0};
int white[9]={0};
int black[9]={0};
int cnt=0;
int whiteQuene(int x)
{
if(x>n){ //白已经排完,相当于成功了,cnt+1
cnt++;
return 0;
}
for(int tj=1;tj<=n;tj++) //寻找满足的列位置
{
if(!vis[x][tj]||tj==black[x]) //不能为0也不能有黑
continue;
int j=1;
for(j;j<x;j++) //判断是否同列同对角线
{
if(white[j]==tj||fabs(x-j)==fabs(tj-white[j]))
break;
}
if(x==j) //if语句进行完以后,tj++,对下一列进行相同操作-------回溯
{
white[x]=tj;
whiteQuene(x+1);
}
}
}
int blackQuene(int x)
{
if(x>n)
{
whiteQuene(1);
return 0;
}
for(int tj=1;tj<=n;tj++) //一个全排列
{
if(!vis[x][tj])
continue;
int j=1;
for(j;j<x;j++)
{
if(black[j]==tj||fabs(x-j)==fabs(tj-black[j]))
{
break;
}
}
if(j==x)
{
black[x]=tj;
blackQuene(x+1);
}
}
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>vis[i][j];
blackQuene(1);
cout<<cnt;
return 0;
}