虽然这是DFS的简单应用,虽然刚学了DFS,但是当遇到题目时,还是云里雾里,递归写法还是不怎么熟练……
递归嘛,在我看来,关键在控制好递归函数的参数,递归出口,标记变量,回溯时清除标记
#include<bits/stdc++.h> using namespace std; char G[15][15]; int vis[8]; int ans,n,k; void dfs(int a,int b) { if(b==k) ans++; else if(a>n) return; else { for(int i=a+1;i<n;i++) { for(int j=0;j<n;j++) { if(G[i][j]=='#'&&!vis[j]) { vis[j]=1; G[i][j]='.'; dfs(i,b+1); vis[j]=0; G[i][j]='#'; } } } } } int main() { while(scanf("%d%d",&n,&k)==2&&(n!=-1||k!=-1)) { for(int i=0;i<n;i++) scanf("%s",G[i]); memset(vis,0,sizeof(vis)); ans=0; dfs(-1,0); printf("%d\n",ans); } return 0; }