记录编号 580825 评测结果 AAAAAAAA
题目名称 城堡 最终得分 100
用户昵称 Gravatar超人 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2023-07-27 08:28:58 内存使用 0.00 MiB
显示代码纯文本
/*
1: 在西面有墙
2: 在北面有墙
4: 在东面有墙
8: 在南面有墙
*/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=55;
int visit[maxn][maxn];//floodfill访问标记
int Map[maxn][maxn];
int dwall[5]={1,2,4,8};//0西 1北 2东 3南 对应的墙标记
//Map[x][y] & dwall[k]为 1,2,4,8表示房间(x,y)在西、北、东、南面有墙
int dx[5]={0,-1,0,1};//0西 1北 2东 3南行值改变方案
int dy[5]={-1,0,1,0};//0西 1北 2东 3南列值改变方案
int n,m;
int s[maxn*maxn]={0};
int c_ans=0,max_ans=0;
void init(){
    scanf("%d%d",&m,&n);
    int wall;
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++){
        scanf("%d",&wall);
        Map[i][j]=wall;//读入每个格子墙状态
    }
    memset(visit,-1,sizeof(visit));//floodfill初始化
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++) visit[i][j]=0;
    s[0]=-1;//设置
}
void dfs(int x,int y,int flag){//深搜floodfill
    if (visit[x][y]) return ;//如果访问过(x,y)或越界
    visit[x][y]=flag; s[flag]++;//未访问过标记房间号
    int xx,yy,wall=Map[x][y];//存储新新动态(x,y)及当前房间的墙状态
    for (int k=0;k<4;k++){//0西 1北 2东 3南
        xx=x+dx[k];yy=y+dy[k];
        if (!(wall&dwall[k])) dfs(xx,yy,flag);//如果当前方向无墙
    }
}
void pushwall(){
    int push_ans=max_ans,push_x,push_y;//分别记录推墙后最大面积,坐标、方向
    char push_d;
    for (int j=0;j<=m+1;j++) visit[0][j]=0;//最上一行城外标记为0
    for (int i=0;i<=n+1;i++) visit[i][m+1]=0;//最右一列城外标记为0
    for (int y=1;y<=m;y++)//从西优先扫描
    for (int x=n;x>0;x--){//从南次优先扫描
        int wall=Map[x][y],s1=-1,s2=-1;
        if (visit[x-1][y]^visit[x][y]) {//如果北边有墙
                s1=s[visit[x][y]]+s[visit[x-1][y]];
                if (s1>push_ans) {
                    push_ans=s1;
                    push_x=x;push_y=y; push_d='N';
                }
        }
        if (visit[x][y+1]^visit[x][y]) {//如果东边有墙
                s2=s[visit[x][y]]+s[visit[x][y+1]];
                if (s2>push_ans){
                    push_ans=s2;
                    push_x=x;push_y=y; push_d='E';
                }
        }
    }
    cout<<push_ans<<endl;
    cout<<push_x<<' '<<push_y<<' '<<push_d<<endl;
}
int main(){
    freopen("castle.in","r",stdin);
    freopen("castle.out","w",stdout);
    init();
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++){
       if (visit[i][j]) continue;
       c_ans++;dfs(i,j,c_ans);
       if(s[c_ans]>max_ans) max_ans=s[c_ans];
    }
    cout<<c_ans<<endl<<max_ans<<endl;
    pushwall();
    return 0;
}