http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65959#problem/A
用dfs做的;
这道题和在棋盘上放皇后的题还是不一样的;
区别在于,放皇后的那题只要求不同行,不同列,不在一条斜线上,可以不断的向下递归,如果有一行无法满足条件,停止递归即可;
但是这个题不同,这个题还有限制;
需要遍历到每一个有可能的地方;
AC代码:

#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s[15][15]; int vis[15],ans,n,m; void dfs(int x,int sum) { if(sum==m) { ans++; } for(int i=x; i<n; i++)//保证了它能遍历到每一个节点; { for(int j=0; j<n; j++) { if(s[i][j]=='#'&&vis[j]==0) { vis[j]=1; dfs(i+1,sum+1);//按行遍历,标记列数; vis[j]=0;//回溯 } } } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==-1&&m==-1) { break; } ans=0; memset(vis,0,sizeof(vis)); for(int i=0; i<n; i++) { scanf("%s",s[i]); } dfs(0,0); printf("%d ",ans); } return 0; }