题意:题意:给出了一个棋盘的状态,现在放一颗黑棋,问最多能把多少颗白旗翻转了,
翻转的规则是:这颗黑棋和另一颗黑棋连线之间都是白旗,则这些白旗都能被翻转.
思路: 找到空位,沿着一个方向开始一直搜素
#include<stdio.h>
#include<string.h>
int d[8][2]={-1,0, -1,1, 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1};//8个方向
char map[10][10];
int maxn,sum;
void Init()
{
int i;
for(i=0;i<=9;i++)
{
map[i][0]='#';
map[i][9]='#';
map[0][i]='#';
map[9][i]='#';
}
}
void dfs(int x,int y,int num,int k)
{
if(map[x][y]=='L')
dfs(x+d[k][0],y+d[k][1],num+1,k);
else if(map[x][y]=='D')
{
sum+=num;
return;
}
else return;
}
int main()
{
int i,j,T,k,cas;
char ch[10];
scanf("%d",&T);
Init();
for(cas=1;cas<=T;cas++)
{
for(i=1;i<=8;i++)
{
scanf("%s",ch);
for(j=0;j<8;j++)
map[i][j+1]=ch[j];
}
maxn=0;
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
{
if(map[i][j]=='*')//在 * 处置黑子D
{
sum=0;
for(k=0;k<8;k++)
{
if(map[i+d[k][0]][j+d[k][1]]=='L')
dfs(i+d[k][0],j+d[k][1],0,k);
}
if(maxn<sum) maxn=sum;
}
}
}
printf("Case %d: %d\n",cas,maxn);
}
return 0;
}

本文介绍了一种基于棋盘状态的策略算法,通过放置黑棋实现最大数量的白棋翻转。使用DFS深度优先搜索策略,遍历所有可能的方向,并记录能够翻转的最大白棋数量。

被折叠的 条评论
为什么被折叠?



