题面:同一格子北边的墙比东边的墙更优先。
88分代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#define int long long
#define re register int
#define il inline
#define inf 0x3f3f3f3f
using namespace std;
il int read()
{
int x=0,f=1;
char c;c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c-'0');
c=getchar();
}
return x*f;
}
const int N=55;
int n,m,i,j,k,l,a[N][N],f[N][N],maxx,ans,t[N*N],tot;
int fx[5]={0,0,0,1,-1},fy[5]={0,1,-1,0,0};
bool b[N][N],c[N][N];
struct node{
int x,y;
};
signed main()
{
m=read();n=read();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
int s=read();
if(s&1)b[i][j]=1;
if(s&2)c[i][j]=1;
if(s&4)b[i][j+1]=1;
if(s&8)c[i+1][j]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
if(!f[i][j]){
f[i][j]=++tot;
int sum=1;
queue<node>q;
q.push((node){i,j});
while(!q.empty())
{
node tmp=q.front();q.pop();
int x=tmp.x,y=tmp.y;
for(re i1=1;i1<=4;i1++)
{
int xx=x+fx[i1],yy=y+fy[i1];
if(xx<1||yy<1||xx>n||yy>m||f[xx][yy])continue;
if(i1==1&&!b[xx][yy]){
f[xx][yy]=tot;sum++;
q.push((node){xx,yy});
}
if(i1==2&&!b[x][y]){
f[xx][yy]=tot;sum++;
q.push((node){xx,yy});
}
if(i1==3&&!c[xx][yy]){
f[xx][yy]=tot;sum++;
q.push((node){xx,yy});
}
if(i1==4&&!c[x][y]){
f[xx][yy]=tot;sum++;
q.push((node){xx,yy});
}
}
}
t[tot]=sum;
maxx=max(maxx,sum);
}
}
printf("%lld\n%lld\n",tot,maxx);
maxx=0;int l,r;char z;
for(j=1;j<=m;j++)
for(i=n;i>=1;i--)
{
//重点
if(c[i][j]&&f[i-1][j]!=f[i][j]&&t[f[i-1][j]]+t[f[i][j]]>maxx){
maxx=t[f[i-1][j]]+t[f[i][j]];
l=i;r=j;z='N';
}
if(b[i][j]&&f[i][j-1]!=f[i][j]&&t[f[i][j-1]]+t[f[i][j]]>maxx){
maxx=t[f[i][j-1]]+t[f[i][j]];
l=i;r=j-1;z='E';
}
}
printf("%lld\n%lld %lld %c",maxx,l,r,z);
return 0;
}
改为这样就过了
for(j=1;j<=m;j++)
for(i=n;i>=1;i--)
{
if(b[i][j]&&f[i][j-1]!=f[i][j]&&t[f[i][j-1]]+t[f[i][j]]>maxx){
maxx=t[f[i][j-1]]+t[f[i][j]];
l=i;r=j-1;z='E';
}
if(c[i][j]&&f[i-1][j]!=f[i][j]&&t[f[i-1][j]]+t[f[i][j]]>maxx){
maxx=t[f[i-1][j]]+t[f[i][j]];
l=i;r=j;z='N';
}
}
先判断东边的墙,在判断北边的墙,和题面不符
??