///简单DFS #include<stdio.h> #include<string.h> int map[10][10],n,k;map保存地图 long num;///保存最后结果 int f[10];///存储每次放棋子的列号 判断要放棋子的列是否已经有棋子 int exist(int t,int k) { int i; for(i=1;i<t;i++) { if(f[i]==k) return 1; } return 0; } 深搜 int dfs(int t,int p) { int i,j; for(i=p;i<n-k+t;i++)/对i的上界进行了一点剪枝,但是效果还是很显著 { for(j=0;j<n;j++) { 这里只保存了已经放了棋子的列号 if(map[i][j]&&(exist(t,j)==0)) { f[t]=j; if(t<k) dfs(t+1,i+1); if(t==k) { num++; } } } } return 0; } int main() { while(scanf("%d%d",&n,&k)==2) { if(n==-1&&k==-1) break; int i,j;char s[10]; num=0; memset(map,0,sizeof(map)); getchar(); for(i=0;i<n;i++) { gets(s); for(j=0;j<n;j++) { if(s[j]=='#') map[i][j]=1; } } 以上进行初始化 dfs(1,0); printf("%d/n",num); } }