POJ 1321 棋盘问题(DFS)
自己居然想了个很麻烦的办法。。。重复搜索了很多次,最后除以K!,果断超时。。。早该想到应该往下搜,就不会重复了,没改好啊,居然又WA几次。。。多亏了虎哥的提示。。。
1 #include <stdio.h> 2 #include <string.h> 3 int n,k; 4 long long num; 5 char p[10][10],h[10],l[10]; 6 void dfs(int x,int y,int step) 7 { 8 int i,j; 9 h[x] = 1; 10 l[y] = 1; 11 if(step == k) 12 { 13 num ++; 14 return ; 15 } 16 for(i = x+1;i <= n-1;i ++) 17 { 18 for(j = 0;j <= n-1;j ++) 19 { 20 if(p[i][j]=='#' && h[i] == 0&& l[j]== 0) 21 { 22 dfs(i,j,step+1); 23 h[i] = 0;l[j] = 0; 24 } 25 } 26 27 } 28 return ; 29 } 30 int main() 31 { 32 int i,j; 33 while(scanf("%d%d%*c",&n,&k)!=EOF) 34 { 35 num = 0; 36 memset(h,0,sizeof(h)); 37 memset(l,0,sizeof(l)); 38 if(n<0&&k<0)break; 39 for(i = 0;i <= n-1;i ++) 40 gets(p[i]); 41 for(i = 0;i <= n-1;i ++) 42 for(j = 0;j <= n-1;j ++) 43 { 44 if(p[i][j]=='#') 45 { 46 dfs(i,j,1); 47 h[i] = 0;l[j] = 0; 48 } 49 } 50 printf("%lld\n",num); 51 } 52 return 0; 53 }