记录编号 313067 评测结果 AAAAAAAA
题目名称 城堡 最终得分 100
用户昵称 Gravataropen the window 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2016-09-28 10:00:58 内存使用 0.61 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dx[4]={-1,1,0,0},
    dy[4]={0,0,-1,1};
char dz[4]={'N','S','W','E'};
int a[101][101][4],q[5001][3],c[101][101],d[101][101];
int ror,n,m,tot,tx,ty,maxx=-10000,maxs=-10000;
bool b[101][101];
char tz;
void up(int x,int y)
{
	tot++;
	b[x][y]=true;
	int tail=1,head=0,xx,yy;
	q[1][1]=x; q[1][2]=y;
	while (head<tail)
	{
		head++;
		for (int i=0; i<4; ++i)  
		{
		   xx=q[head][1]+dx[i];
		   yy=q[head][2]+dy[i];
		   if (xx>0 && xx<=n && yy>0 && yy<=m && !b[xx][yy] && a[q[head][1]][q[head][2]][i]==0) 
		   {
		   	    tail++;
		   	    b[xx][yy]=true;
		   	    q[tail][1]=xx;
		   	    q[tail][2]=yy;
		   }
		} 
    }
	for (int j=1; j<=tail; ++j) 
	{
		c[q[j][1]][q[j][2]]=tail;
		d[q[j][1]][q[j][2]]=tot;
	}
	if (tail>maxx) maxx=tail; 
}
int main()
{
    freopen("castle.in","r",stdin);
	freopen("castle.out","w",stdout);
	int i,j;
	scanf("%d%d",&m,&n);
	for (i=1; i<=n; ++i)
	 for (j=1; j<=m; ++j)
	 {
	 	scanf("%d",&ror);
	 	if (ror>=8) {ror-=8; a[i][j][1]=1;}
	 	if (ror>=4) {ror-=4; a[i][j][3]=1;}
	 	if (ror>=2) {ror-=2; a[i][j][0]=1;} 
	 	if (ror>=1) {ror-=1; a[i][j][2]=1;} 
	 }
	for (i=1; i<=n; ++i)
	 for (j=1; j<=m; ++j)
	  if (!b[i][j]) up(i,j);
	printf("%d\n%d\n",tot,maxx); 
	/*
    for (i=1; i<=n; ++i)
	{
	  for (j=1; j<=m; ++j) printf("%d",c[i][j]);
	  printf("\n");
	}
	*/
	for (j=1; j<=m; ++j)
	 for (i=n; i>=1; --i)
	 {
		for (int l=0; l<4; ++l)
		{
			int xx=i+dx[l],yy=j+dy[l];
			if (d[xx][yy]!=d[i][j] && maxs<c[i][j]+c[xx][yy])
			{
				maxs=c[i][j]+c[xx][yy];
                tx=i; ty=j; tz=dz[l];
			}
		}
	 }
	 printf("%d\n",maxs);
	 printf("%d %d %c\n",tx,ty,tz);
	 return 0;
}