poj 1321 DFS
/* 题意:中文题,忽略 题解:DFS;因为k<=n,因此和普通的棋盘问题又有点不同,就是在搜索时要 注意某些行可能会没有点。 */ #include <iostream> #include <cstring> using namespace std; int n,k,ans; int vis_cl[10];//记录列是否已存在点 char m[10][10]; void dfs(int r, int sum)//DFS,r为当前行,sum为当前搜索到的点的个数 { if (sum == k)//满足k个,结束搜索 { ans++; return; } if (r >= n)//越界结束 return ; for(int j=0; j<n; j++) { if ('#'==m[r][j] && !vis_cl[j])//有点就先搜索,后复原 { vis_cl[j] = 1; dfs(r+1,sum+1); vis_cl[j] = 0; } } dfs(r+1,sum);//并不是所有行都有点,因此为了让DFS不在搜索完所有 //解之前退出,这句的意思是当前行不加点,但是要继 //续搜索下一行 } int main(void) { while (cin>>n>>k && n!=-1 && k!=-1) { for(int i=0; i<n; i++) cin>>m[i]; ans = 0; memset(vis_cl,0,sizeof(vis_cl)); dfs(0,0); cout<<ans<<endl; } return 0; }