给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个皇后,使任意的两个皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
#include<iostream>
using namespace std;
int total=0;
int c[100];
bool is_ok(int row) //判断第row行的c[row]位置是否可以放置皇后
{
for(int j=0;j<row;j++)
if(c[row]==c[j]||(row+c[row]==j+c[j])||(row-c[row]==j-c[j]))//判断是否在同一列或者同一对角线上
return false;
return true;
}
void queue(int row,int n)
{
if(row==n)
total++;
else
{
for(int col=0;col<n;col++)
{
c[row]=col; //表示第row行的col(即c[row])位置可以放置皇后
if(is_ok(row))
queue(row+1,n);
}
}
}
int main()
{
int n; //当n为8的时候为八皇后
cin>>n;
queue(0,n);
cout<<total;
}
或者是用一个函数,把判断的条件放在queue函数的里面
#include<iostream>
using namespace std;
#define N 100
int q[N];
int cb[N][N];
int count=0;
int num;
int queue(int pos)
{
for(int i=0;i<pos-1;i++)
{
int judge=q[i]-q[pos-1];
if(judge==0||judge==pos-1-i||-judge==pos-1-i)
return 0;
}
if(pos==num)
{
count++;
}
for(int i=0;i<num;i++)
{
if(cb[pos][i])
{
q[pos]=i;
queue(pos+1);
}
}
}
int main()
{
cin>>num;
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
cin>>cb[i][j];
queue(0);
cout<<count;
}