接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int map[15][15];
int amount=0;
int T;
int nothere(int x,int y)//bu neng fang zai zhe li return 1
{
for(int row=0;row<x;row++)
if(map[row][y]==map[x][y] )return 1;
int x1,y1;
x1=x-1;y1=y-1;
while(x1>=0&&y1>=0&&x1<T&&y1<T)
{
if(map[x1][y1]==map[x][y])return 1;
x1--;y1--;
}
x1=x-1;y1=y+1;
while(x1>=0&&y1>=0&&x1<T&&y1<T)
{
if(map[x1][y1]==map[x][y])return 1;
x1--;y1++;
}
return 0;
}
void dfs(int row)//red 100 black 200
{
if(row==T)
{
//cout<<"T:"<<T<<endl;
amount++;
return;
}
for(int red=0;red<T;red++)
{
if(map[row][red]==1)
{
map[row][red]=100;
if(nothere(row,red))
{
map[row][red]=1;
continue;
}
}
else continue;
for(int black=0;black<T;black++)
{
//cout<<map[row][black];
if(map[row][black]==1)
{
map[row][black]=200;
if(nothere(row,black))
{
map[row][black]=1;
continue;
}
else
{
//cout<<row;
dfs(row+1);
map[row][black]=1;
}
}
//else return;
}
map[row][red]=1;
}
}
int main()
{
//freopen("input.txt","r",stdin);
cin>>T;
for(int i=0;i<T;i++)
for(int j=0;j<T;j++)
{
scanf("%d",&map[i][j]);
}
dfs(0);
cout<<amount;
return 0;
}