记录编号 37609 评测结果 AAAAAAAA
题目名称 城堡 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2012-04-04 16:04:47 内存使用 0.34 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring> 
#include <queue>
#include <algorithm>
#include <utility>
#define NOR 1
#define SOU 2
#define WES 3
#define EAS 4
#define MAXN 55
#define NUL 0
#define mp(i,j) make_pair(i,j)
using namespace std;
int Wall[MAXN][MAXN][5];
int M,N;
int Top=0,Ans;
int Num[MAXN][MAXN];
int Len[MAXN*MAXN]={0};
int step[5][2]={{},{-1,0},{1,0},{0,-1},{0,1}};
typedef pair<int,int> Pair;
queue<Pair> Q;

inline int lowbit(int x){return x&(-x);}
void init()
{
	memset(Wall,NUL,sizeof(Wall));
	scanf("%d %d\n",&M,&N);
	int x,y;
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=M;j++)
		{
			scanf("%d\n",&x);
			while(x)
			{
				y=lowbit(x);
				if(y==8) Wall[i][j][SOU]=1;
				if(y==4) Wall[i][j][EAS]=1;
				if(y==2) Wall[i][j][NOR]=1;
				if(y==1) Wall[i][j][WES]=1;
				x-=y;
			}/*
			printf("%d %d -> NORTH: %d    ",i,j,Wall[i][j][NOR]);
			printf("SOUTH: %d    ",Wall[i][j][SOU]);
			printf("WEST: %d     ",Wall[i][j][WES]);
			printf("EAST: %d\n",Wall[i][j][EAS]);*/
		}
	}
}



inline void BFS(int x,int y)
{
	int res=0;
	Q.push(mp(x,y));
	Num[x][y]=Top;
	int tx,ty,nx,ny;
	while(!Q.empty())
	{
		res++;
		tx=Q.front().first,ty=Q.front().second;
		Q.pop();
		for(int i=1;i<=4;i++)
		{
			nx=tx+step[i][0];
			ny=ty+step[i][1];
			if(nx>N || nx<1 || ny<1 || ny>M) continue;
			if(Num[nx][ny]) continue;
			if(Wall[tx][ty][i]) continue;
			Num[nx][ny]=Top;
			Q.push(mp(nx,ny));
		}
	}
	Len[Top]=res;
}

inline void solve()
{
	memset(Num,NUL,sizeof(Num));
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
		{
			if(Num[i][j]!=0) continue;
			Top++;
			BFS(i,j);
		}
	printf("%d\n",Top);	
	printf("%d\n",*max_element(Len,Len+Top+1));
	
	int MaxTmp=0;
	int Posx,Posy;char dir;
	int ti,tj;
	int tb1,tb2,tmp;
	for(int j=1;j<=M;j++)
	{
		for(int i=N;i>=1;i--)
		{
			tb1=Num[i][j];
			if(i>1) //North
			{
				ti=i-1,tj=j,tb2=Num[ti][tj];
				if(tb1!=tb2)
				{
					tmp=Len[tb1]+Len[tb2];
					if(tmp>MaxTmp)
					{
						MaxTmp=tmp;
						Posx=i,Posy=j,dir='N';
					}
				}
			}
			
			if(j<M) //East
			{
				ti=i,tj=j+1,tb2=Num[ti][tj];
				if(tb1!=tb2)
				{
					tmp=Len[tb1]+Len[tb2];
					if(tmp>MaxTmp)
					{
						MaxTmp=tmp;
						Posx=i,Posy=j,dir='E';
					}
				}
			}
			
		}
	}
	printf("%d\n%d %d %c",MaxTmp,Posx,Posy,dir);
	return;
}

int main()
{
	freopen("castle.in","r",stdin);
	freopen("castle.out","w",stdout);
	init();
	solve();
	return 0;
}