题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3368
题目大意:给定一个棋盘的初始状态,问下一颗黑棋放下的时候最多能将几颗白棋翻转(两颗黑棋之间的白棋将被翻转)。
思路:枚举所有可以下子的点,每个点从8个方向进行寻找每个方向上的下一个黑子,得到该点能翻转的白棋数,比较输出最大的。
AC代码
#include<iostream>
#include<cstdio>
#define N 10
using namespace std;
char Map[N][N];
int dx[]={0,1,1,1,0,-1,-1,-1};
int dy[]={1,1,0,-1,-1,-1,0,1};
int Search_count(int a,int b)
{
int Sx,Sy,cnt=0;
for(int i=0;i<8;i++){
Sx=a+dx[i];
Sy=b+dy[i];
int num=0;
while(Map[Sx][Sy]=='L'){
num++;
Sx+=dx[i];
Sy+=dy[i];
}
if(Map[Sx][Sy]=='D') cnt+=num;
}
return cnt;
}
int main()
{
int times=0,T;
scanf("%d",&T);
while(T--){
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
scanf(" %c",&Map[i][j]);
}
}
int Ans=0,ans=0;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(Map[i][j]=='*'){
ans=(Search_count(i,j));
if(ans>Ans) Ans=ans;
}
}
}
printf("Case %d: %d\n",++times,Ans);
}
return 0;
}