给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 nn 个黑皇后和 nn 个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?nn 小于等于 88。
输入格式
输入的第一行为一个整数 nn,表示棋盘的大小。
接下来 nn 行,每行 nn 个 00 或 11 的整数,如果一个整数为11,表示对应的位置可以放皇后,如果一个整数为 00,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入1
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出1
2
样例输入2
4 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出2
0
代码:
n皇后代码
#include <bits/stdc++.h>
using namespace std;
// n皇后所有位置都可以放
// 带有不能安放位置的n皇后
int a[8][8];
int n;
int mark[8];
int cnt = 0;//计数
int judge(int row,int column)
{//判断列和斜角
for(int i = 0; i < row;i++)
{
if(/*判断列*/column == mark[i]||/*判断斜角*/abs(row-i)==abs(column-mark[i]))
return 0;
}
return 1;
}
void Queue(int row)
{
if(row == n)
cnt++;//当找到一个解决方法时就增加
else
{
for(int i = 0; i < n; i++)
{
if(judge(row,i) )//&&a[row][i]/*可能是当前位置存在障碍不可以放*/ /*这个就是判断当前位置能否放置
{ //location数组标记每一列
mark[row] = i;//第row行的第i个放置皇后
Queue(row+1);//每一行row在变化不存在每一行有多个皇后 故而只用判断斜角和列
}
}
}
}
int main()
{
memset(mark,0,sizeof mark);
scanf("%d",&n);
//如果输入的带有不能安放皇后的棋盘
//输入时 0代表不能安放 1代表可以安放
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d",&a[i][j]);
Queue(0);
cout<<cnt<<endl;
return 0;
}
本题目解决代码:
#include <bits/stdc++.h>
using namespace std;
int a[8][8];
int n;
int markblack[8];
int markwrite[8];
int cnt = 0;//计数
int judgeblack(int row,int column)
{
for(int i = 0; i < row; i++)
{
if(column == markblack[i]||abs(row-i) == abs(column-markblack[i]))
return 0;
}
return 1;
}
int judgewrite(int row,int column)
{
for(int i = 0; i < row; i++)
{
if(column == markwrite[i]||abs(row-i) == abs(column-markwrite[i]))
return 0;
}
return 1;
}
int Queue(int row_black,int row_write)
{
if(row_black == n)
{
//再来搜索白皇后
if(row_write == n)
cnt++;
else
{
for(int i = 0; i < n; i++)
{
if(a[row_write][i]&&judgewrite(row_write,i))
{
markwrite[row_write] = i;
Queue(row_black,row_write+1);
}
}
}
}
else
{
for(int i = 0; i < n; i++)
{
if(a[row_black][i]&&judgeblack(row_black,i))
{
markblack[row_black] = i;
a[row_black][i] = 0; //存放黑皇后 后不能再存放白皇后 故令其为0
Queue(row_black+1,row_write);
a[row_black][i] = 1; //对应
}
}
}
}
int main()
{
scanf("%d",&n);
//如果输入的带有不能安放皇后的棋盘
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d",&a[i][j]);
Queue(0,0);
cout<<cnt<<endl;
return 0;
}