题目链接:
就是讲一种下棋的方法,很多人小时候也应该玩过,输入8*8的矩阵代表棋盘,*代表空位
D代表黑子,L代表白子,现在你手里只有一颗黑子,问你把这颗黑子放在哪里能够吃掉最多的白子
当一个方向上(斜方向也算)首尾都是黑子的时候它中间的白子当然就会被吃掉。
因为只有8*8的大小,所以可以枚举每一个棋子的八个方向统计能够吃多少个白子,类似于DFS
起初想的是枚举每个黑子,但是后来发现了漏掉了类似于D L L * L L D的情况 而且要改貌似有点麻烦
L L L
D D D
索性就换成了枚举每个*的位置 这样的好处是不会漏掉特殊情况,也比较简短
1 #include2 #include 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 }