记录编号 |
326318 |
评测结果 |
AAAAAAAA |
题目名称 |
城堡 |
最终得分 |
100 |
用户昵称 |
浮生随想 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.078 s |
提交时间 |
2016-10-21 07:20:50 |
内存使用 |
0.25 MiB |
显示代码纯文本
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[55][55],ans1,T;
int n,m,ax,ay;
char dir;
int f[55][55];
int dfs(int x,int y){
if(f[x][y]==T) return 0;
if(x<=0||y<=0||x>m||y>n)return 0;
f[x][y]=T;
int k=a[x][y],sum=1;
if(!(k&8))sum+=dfs(x+1,y);
if(!(k&4))sum+=dfs(x,y+1);
if(!(k&2))sum+=dfs(x-1,y);
if(!(k&1))sum+=dfs(x,y-1);
return sum;
}
int main(){
freopen("castle.in","r",stdin);
freopen("castle.out","w",stdout);
memset(f,0,sizeof f);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
int sum=0,ans=0,x=0;
T++;
for(int i=1; i<=m; i++)
for(int j=1;j<=n;j++)
if(f[i][j]!=T){
sum++;
x=dfs(i,j);
ans=max(ans,x);
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
T++;
if(a[i][j]&2){
a[i][j]^=2;
x=dfs(i,j);
if(x>ans1)ax=i,ay=j,dir='N',ans1=x;
else if(x==ans1){
if(ay>j)
ax=i,ay=j,dir='N';
else if(ay==j&&ax<i)
ax=i,ay=j,dir='N';
}
a[i][j]^=2;
}
T++;
if(a[i][j]&4){
a[i][j]^=4;
x=dfs(i,j);
if(x>ans1)ax=i,ay=j,dir='E',ans1=x;
else if(x==ans1){
if(ay>j)
ax=i,ay=j,dir='E';
else if(ay==j&&ax<i)
ax=i,ay=j,dir='E';
}
a[i][j]^=4;
}
}
printf("%d\n%d\n%d\n%d %d %c",sum,ans,ans1,ax,ay,dir);
//while(1);
return 0;
}