思路:一开始直接暴力dfs,然后被t;
其实这题一个小改动就行了,用两个数组记录这行这列有没有放过棋子,这样就不用每次都进行判断了
代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <cstring>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stdio.h>
#define esp 1e-4
using namespace std;
char chart[10][10];
bool vist[10][10];
int node[100][2];
int n,k,nodes;
int ans;
int row[10];
int col[10];
void dfs(int id,int len)
{
if(len==k)
{
ans++;
return ;
}
for(int i=id;i<nodes;i++)
{
if(!row[node[i][0]] && !vist[node[i][0]][node[i][1]] && !col[node[i][1]])
{
vist[node[i][0]][node[i][1]]=true;
row[node[i][0]]=1;
col[node[i][1]]=1;
//cout<<node[i][0]<<" "<<node[i][1]<<endl;
dfs(i,len+1);
vist[node[i][0]][node[i][1]]=false;
row[node[i][0]]=0;
col[node[i][1]]=0;
}
}
}
int main()
{
while(cin>>n>>k )
{
memset(vist,0,sizeof(vist));
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
nodes=0;
if(n==-1 && k==-1)
break;
for(int i=0;i<n;i++)
{
cin>>chart[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(chart[i][j]=='#')
{
node[nodes][0]=i;
node[nodes++][1]=j;
}
}
}
//cout<<nodes<<endl;
ans=0;
dfs(0,0);
cout<<ans<<endl;
/*
4 4
####
####
####
####
*/
}
return 0;
}