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 }

 

posted @ 2012-05-31 21:49  Naix_x  阅读(198)  评论(0编辑  收藏  举报