JZOJ 3319. 【BOI2013】雪地踪迹【bfs】【卡常】

3 篇文章 0 订阅


题目:

传送门


题意:

给出一个雪地,有两种动物在图上沿着相邻的格子走,从 ( 1 , 1 ) (1,1) (1,1) ( n , m ) (n,m) (n,m),后来的脚印会将前面的脚印覆盖
现在给出最后的脚印图,问最少出现了几只动物


分析:

因为连接起点和终点的道路必定是最后一只走的,而与这条道路相邻且所属不同的则为倒数第二个 … … …… 以此类推
所以我们可以使用 b f s bfs bfs来拓展道路,因为相邻而所属不同的脚印是下一次的,所以我们可以放到下一次开始遍历的序列中
P.S. 可能 J Z O J JZOJ JZOJ太慢了,所以一定要加上超级优化才能过,不然即使在 L O J LOJ LOJ A A A了还是 T T T成狗


代码:

#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<string>
#include<queue>
#define LZX IMU
using namespace std;
inline int read() {
    int d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}     
int tx[5]={0,1,-1,0,0};
int ty[5]={0,0,0,1,-1};
queue<int> qx[2],qy[2];
char t[4005][4005],cc;
int tf[4005][4005],n,m;
int x,y,vx,vy;
int bfs(int k)
{
	int tt=0;
	while(qx[k].size())
	{
		x=qx[k].front(),y=qy[k].front();
		qx[k].pop();qy[k].pop();
		for(int i=1;i<=4;i++)
		{
			vx=x+tx[i],vy=y+ty[i];
			if(vx<1||vx>n||vy<1||vy>m||tf[vx][vy]||t[vx][vy]=='.') continue;
			if(t[x][y]==t[vx][vy]) qx[k].push(vx),qy[k].push(vy);
			else qx[k^1].push(vx),qy[k^1].push(vy),tt=1;
			tf[vx][vy]=1;
		}
	}
	return tt;
}
int main()
{
	freopen("tracks11.in","r",stdin);
	n=read();m=read();
	for(int i=1;i<=n;i++) gets(t[i]+1);
	tf[1][1]=1;
	qx[0].push(1);qy[0].push(1);
	int ans=1;
	for(int k=0;;k^=1) {if(!bfs(k)) break;ans++;}
	return !printf("%d",ans);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值