挺像搜索的,对每个*点,找它的八个方向,满足游戏规则就+1,最后保留最大的。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char map[10][10];
int direct[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
int ans;
int tmp;
bool istrue(int i,int j)
{
if(i>=0&&i<8&&j>=0&&j<8&&map[i][j]=='L')
return 1;
return 0;
}
void dfs(int i,int j,int d,int tot)
{
if(map[i][j]=='*'&&tot) return;
if(map[i+direct[d][0]][j+direct[d][1]]=='D'&&tot)
{
tmp+=tot;
return;
}
if(istrue(i+direct[d][0],j+direct[d][1]))
dfs(i+direct[d][0],j+direct[d][1],d,tot+1);
}
int main()
{
int t;
int cases=1;
char str[9];
scanf("%d",&t);
while(t--)
{
ans=0;
for(int i=0;i<8;i++)
scanf("%s",map[i]);
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
if(map[i][j]!='*') continue;
tmp=0;
for(int d=0;d<8;d++)
dfs(i,j,d,0);
if(tmp>ans)
ans=tmp;
}
printf("Case %d: %d\n",cases++,ans);
}
return 0;
}