【枚举】LAGNO(jzoj 1149)

版权声明:欢迎借鉴,谢绝抄搬。 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);
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86696509