深搜,掌握的不很熟练,递归点老弄不好,加油吧。 #include<iostream> using namespace std; char map[8][8]; bool rol[8];//标记列是否已放过 int n,k; int count;//满足的条件的个数 void dfs(int r,int steps) { if(steps==k)//如果已走k步 { count++; return; } if(r>=n) return;//如果越界则返回 for(int i=0;i<n;i++)//按行走 { if(map[r][i]=='#'&&rol[i]==0)//如果遇见#,并且所在列没有被放 { rol[i]=1;//标记为走过 dfs(r+1,steps+1); rol[i]=0;//还原 } } dfs(r+1,steps);//如果所在行没有#,继续下一行 } int main() { while(scanf("%d%d",&n,&k)==2&&!(n==-1&&k==-1)) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>map[i][j]; count=0; memset(rol,0,sizeof(rol)); dfs(0,0); printf("%d/n",count); } return 0; }