有点问题
查看原帖
有点问题
109220
Farkas_W楼主2020/10/14 09:29

题面:同一格子北边的墙比东边的墙更优先。

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';
		}
	}

先判断东边的墙,在判断北边的墙,和题面不符

??

2020/10/14 09:29
加载中...