看到DFS题目,要是没有想法真的好难,要是思路清晰也真的很容易
此题我一直迷糊当棋子数小于行数子怎么继续DFS......当参考了别人的解题报告才明白啊.....此题要不要预处理感觉也没有大碍吧......只要逐行DFS下去就可以了....
直接贴代码吧.....DFS and BFS感觉真的好抽象.....慢慢来理解吧
#include<cstdio>
#include<cstring>
const int N=10;
char tmp[N];
int vis[N];
int n, k;
int tot=0;
int map[N][N];
void dfs(int cur, int num)
{
if(num == k)
{
tot++;
return;
}
if(n+num-cur < k)//剪枝 剩余行数 小于 剩余棋子
return;
if(cur==n)
return;
for(int i=0; i<n; i++)
{
if(map[cur][i] && !vis[i])
{
vis[i]=1;
dfs(cur+1,num+1);
vis[i]=0;
}
}
dfs(cur+1, num);
}
int main()
{
while(scanf("%d%d",&n, &k) == 2 && n != -1 && k != -1)
{
tot=0;
memset(vis, 0, sizeof(vis));
memset(map, 0, sizeof(map));
for(int i=0; i< n; i++)
{
scanf("%s",tmp);
for(int j=0; j<n; j++)
if(tmp[j] == '#')
map[i][j]=1;
}
dfs(0,0);
printf("%d\n",tot);
}
return 0;
}