简单搜索 练习一下回溯
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <sstream> 5 #include <string> 6 #include <algorithm> 7 #include <list> 8 #include <map> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <cstdlib> 14 using namespace std; 15 int n,k; 16 int ans; 17 char s[10][10]; 18 int usex[10],usey[10]; 19 bool ok(int x,int y){ 20 if(x<0||x>=n||y<0||y>=n) 21 return 0; 22 if(s[x][y]=='.'){ 23 return 0; 24 } 25 if(usex[x]==1||usey[y]==1) 26 return 0; 27 return 1; 28 } 29 void dfs(int x,int y){ 30 if(y==k){ 31 ans++; 32 return ; 33 } 34 if(x>n){ 35 return ; 36 } 37 for(int i=0;i<n;i++){ 38 if(ok(x,i)){ 39 usey[i]=1; 40 usex[x]=1; 41 dfs(x+1,y+1); 42 usey[i]=0; 43 usex[x]=0; 44 } 45 } 46 dfs(x+1,y); 47 } 48 int main(){ 49 while(~scanf("%d%d",&n,&k),n!=-1||k!=-1){ 50 ans=0; 51 memset(usey,0,sizeof(usey)); 52 memset(usex,0,sizeof(usex)); 53 for(int i=0;i<n;i++){ 54 scanf("%s",s[i]); 55 } 56 dfs(0,0); 57 printf("%d ",ans); 58 } 59 return 0; 60 }