看到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;
}