dfs思路
暴搜每一个棋盘区域,递归到下一层的时候搜索当前棋盘区域的下一个棋盘区域,用一个数组pair来存棋盘区域的坐标,数组下标就是棋盘区域的序号
代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 15;
char a[N][N];
PII qipan[N*N*N*N];
int geshu;
int cnt;
int n,k;
bool judge(PII l)
{
int x=l.first,y=l.second;
for(int i=0;i<n;i++)
{
if(a[i][y]=='*'||a[x][i]=='*')return false;
}
return true;
}
void dfs(int x,int start)
{
if(x==k)
{
cnt++;
return;
}
for(int i=start;i<geshu;i++)
{
if(judge(qipan[i]))
{
a[qipan[i].first][qipan[i].second]='*';
dfs(x+1,i+1);
a[qipan[i].first][qipan[i].second]='#';
}
}
return;
}
int main()
{
while(1)
{
geshu=0;
cnt=0;
cin>>n>>k;
if(n==-1&&k==-1)break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='#')
{
qipan[geshu++]={i,j};
}
}
}
dfs(0,0);
cout<<cnt<<endl;
}
return 0;
}