版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86696509
LAGNO
题目大意:
给你一个8×8的矩阵,里面有黑棋(B),白棋(W),还有一些格子没棋子(.),当两个黑棋在同一条直线上,并且他们之间全是白棋(不能没棋子),那么他们两个黑棋可以使他们之间的白棋变黑,但棋子变黑后不能去将其他棋子变黑,问在空位放一颗黑棋最多可以使多少颗白棋变黑
样例输入
…
…
…
…BW…
…WB…
…
…
…
样例输出
1
解题思路:
先枚举每一个位置,如果是白棋就判断它的各个方向是否有黑棋,如果有黑棋,就往反方向延伸,是白棋就ans++,继续延伸,当不是白棋是就将这个位置记为ans,最后枚举一遍,判断是否为空,如果为空,就求最大值
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int dx[8]={1,1,0,-1,-1,-1,0,1};//八个方向
const int dy[8]={0,1,1,1,0,-1,-1,-1};
int h,l,sum,maxx,f[15][15],a[15][15];
char x;
int main()
{
for (int i=1;i<=8;++i)
for (int j=1;j<=8;++j)
{
cin>>x;
if (x=='W') f[i][j]=2;//记录
if (x=='B') f[i][j]=1;
}
for (int i=1;i<=8;++i)
for (int j=1;j<=8;++j)
if (f[i][j]==2)//白棋
for (int k=0;k<8;++k)//八个方向
if (f[i+dx[k]][j+dy[k]]==1)//判断是否为黑棋
{
h=i+dx[(k+4)%8];//反向走一步(行)
l=j+dy[(k+4)%8];//列
sum=1;//自己
while (f[h][l]==2)//是白棋子
{
h+=dx[(k+4)%8];//再走
l+=dy[(k+4)%8];
sum++;//记录
}
a[h][l]+=sum;//累加
}
for (int i=1;i<=8;++i)
for (int j=1;j<=8;++j)
if (!f[i][j])//没棋子,可以放
maxx=max(maxx,a[i][j]);//求最大的
printf("%d",maxx);
}