小学数学很重要,50*50我竟然算成了250,还找了半天错
/*
ID: jinusac1
PROG: castle
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef struct POS{
int x,y;
}pos;
int room[60][60],cl[60][60];
int c=1,Maxs=0,sq,ss[3000],dir[5][2]={0,-1,-1,0,0,1,1,0},Hash[]={4,8,1,2},rx,ry;
char r;
bool mark[55][55];
void bfs(int x,int y)
{
pos t;
t.x=x;t.y=y;
queue<pos> h;
h.push(t);
sq=1;
while(!h.empty()){
int tx=h.front().x,ty=h.front().y;
h.pop();
for(int i=0;i<4;i++){
if(mark[tx+dir[i][0]][ty+dir[i][1]]) continue;
if(room[tx][ty]&(1 << i)) continue;
cl[tx+dir[i][0]][ty+dir[i][1]]=cl[tx][ty];
t.x=tx+dir[i][0];t.y=ty+dir[i][1];
mark[t.x][t.y]=true;
h.push(t);
sq++;
}
}
if(sq>Maxs) Maxs=sq;
ss[c]=sq;
c++;
}
int main()
{
freopen("castle.in","r",stdin);
freopen("castle.out","w",stdout);
int m,n;
cin>>m>>n;
memset(mark,true,sizeof(mark));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>room[i][j];
mark[i][j]=false;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(!mark[i][j]){
cl[i][j]=c;
mark[i][j]=true;
bfs(i,j);
}
}
cout<<c-1<<endl;
cout<<Maxs<<endl;
Maxs=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) mark[i][j]=false;
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++){
if(!mark[i+1][j]){
if(cl[i][j]!=cl[i+1][j]){
sq=ss[cl[i][j]]+ss[cl[i+1][j]];
if(Maxs<sq) {Maxs=sq;rx=i+1;ry=j;r='N';}
else if(Maxs==sq){
if(ry>j) {Maxs=sq;rx=i+1;ry=j;r='N';}
else if(ry==j&&rx<(i+1)) {Maxs=sq;rx=i+1;ry=j;r='N';}
}
}
}
if(!mark[i][j+1]){
if(cl[i][j]!=cl[i][j+1]){
sq=ss[cl[i][j]]+ss[cl[i][j+1]];
if(Maxs<sq) {Maxs=sq;rx=i;ry=j;r='E';}
else if(Maxs==sq){
if(ry>j) {Maxs=sq;rx=i;ry=j;r='E';}
else if(ry==j&&rx<i) {Maxs=sq;rx=i;ry=j;r='E';}
}
}
}
}
cout<<Maxs<<endl;
cout<<rx<<" "<<ry<<" "<<r<<endl;
return 0;
}