题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3368

就是讲一种下棋的方法,很多人小时候也应该玩过,输入8*8的矩阵代表棋盘,*代表空位

D代表黑子,L代表白子,现在你手里只有一颗黑子,问你把这颗黑子放在哪里能够吃掉最多的白子

当一个方向上(斜方向也算)首尾都是黑子的时候它中间的白子当然就会被吃掉。

因为只有8*8的大小,所以可以枚举每一个棋子的八个方向统计能够吃多少个白子,类似于DFS

起初想的是枚举每个黑子,但是后来发现了漏掉了类似于D L L * L L D的情况 而且要改貌似有点麻烦

                                                                               L L L

                                                                            D   D    D

索性就换成了枚举每个*的位置 这样的好处是不会漏掉特殊情况,也比较简短

 

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int yi[8][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};  //列举八个方向
 5 char map[10][10];
 6 int x,y,sum,m,i,j,k;
 7 void dfs(int s)
 8 {
 9     if (x<0||x>8||y<0||y>8||map[x][y]=='*')  return ;
10     if (map[x][y]=='L')  {s++; }  //统计这一个方向白子的个数
11     if (map[x][y]=='D')  {m+=s; return ;} //每个方向上的个数加在一起
12     x=x+yi[k][0];
13     y=y+yi[k][1];
14     dfs(s);
15 }
16 int main()
17 {
18     int n,cut=0;
19     scanf("%d",&n);
20     while (n--)
21     {
22         cut++;
23         sum=0;
24         for (i=0;i<8;i++)
25         scanf("%s",&map[i]);
26         for (i=0;i<8;i++)
27         for (j=0;j<8;j++)
28         {
29             m=0;
30             if (map[i][j]=='*')
31             {
32                 for (k=0;k<8;k++)
33                 {
34                     x=i+yi[k][0];//枚举八个方向
35                     y=j+yi[k][1];
36                     dfs(0);
37                 }
38             }
39             if (m>sum) sum=m;
40         }
41         printf("Case %d: %d\n",cut,sum);
42     }
43     return 0;
44 }

 

  

posted on 2015-07-21 16:36  蜘蛛侦探  阅读(265)  评论(0编辑  收藏  举报