题目:
题意:
给出一个雪地,有两种动物在图上沿着相邻的格子走,从
(
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);
}