题目链接: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 }