//一道第二章的题拖到了现在 写了半小时调了半小时好菜啊qwq
用leftt[][],rightt[][],up[][],down[][]来记录四周有木有墙
一开始先dfs确定有多少房间并标号
然后从最西最南开始枚举,拆了墙的话最大是多少,最后输出即可。
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 101
using namespace std;
map<int,char>mp2;
char ans_c;
int up[N][N],down[N][N],leftt[N][N],rightt[N][N],mp[N][N],rec[N][N];
int large[N*N],dy[4]={-1,0,0,1},dx[4]={0,1,-1,0};
int n,m,id,ans_x,ans_y,ans_size,ans_size2,ans_dir;
bool judge(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
int read()
{
int f=1,ret=0;char ch=getchar();
for (;!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
for (;isdigit(ch);ch=getchar()) ret=ret*10+ch-'0';
return f*ret;
}
void handle(int x,int y)
{
for (int i=1;i<=mp[x][y];i<<=1)
{
if (mp[x][y]&i)
{
if (i==1) leftt[x][y]=1;
if (i==2) up[x][y]=1;
if (i==4) rightt[x][y]=1;
if (i==8) down[x][y]=1;
}
}
}
void dfs(int x,int y,int id)
{
if (rec[x][y]) return;
large[id]++;rec[x][y]=id;
if (!leftt[x][y]&&judge(x,y-1)) dfs(x,y-1,id);
if (!rightt[x][y]&&judge(x,y+1)) dfs(x,y+1,id);
if (!up[x][y]&&judge(x-1,y)) dfs(x-1,y,id);
if (!down[x][y]&&judge(x+1,y)) dfs(x+1,y,id);
}
int main()
{
m=read();n=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
mp[i][j]=read();
handle(i,j);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (!rec[i][j])
{
dfs(i,j,++id);
if (large[id]>ans_size) ans_size=large[id];
}
}
/*for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++) printf("%d ",rec[i][j]);
printf("\n");
}*/
for (int j=1;j<=m;j++)
for (int i=n;i>=1;i--)
{
for (int k=0;k<4;k++)
{
int x=i+dx[k],y=j+dy[k];
if (judge(x,y)&&rec[x][y]!=rec[i][j]&&ans_size2<large[rec[x][y]]+large[rec[i][j]])
{
ans_size2=large[rec[x][y]]+large[rec[i][j]];
ans_x=i;ans_y=j;ans_dir=k;
}
}
}
mp2[0]='W';mp2[1]='S';mp2[2]='N';mp2[3]='E';
printf("%d\n%d\n%d\n%d %d %c\n",id,ans_size,ans_size2,ans_x,ans_y,mp2[ans_dir]);
return 0;
}