Link
Solve
一道非常典型的spfa变形,将相同的边权定为0,不同的定为1,然后直接刷spfa就好了
but为啥我wa了,对拍还不死,求神仙看看。
Code
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
const int maxn=505;
const int flg[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int n,m,Q[maxn*maxn][2],dis[maxn][maxn],vis[maxn][maxn],sx,sy,dx,dy;
char a[maxn][maxn];
bool check(int x,int y){return x<1||x>n||y<1||y>m;}
int spfa(){
int hed=0,til=1;
memset(dis,63,sizeof dis);
memset(vis,0,sizeof vis);
Q[til][0]=sx,Q[til][1]=sy,vis[sx][sy]=1;dis[sx][sy]=0;
while(hed!=til){
hed=(hed+1)%(maxn*maxn);vis[Q[hed][0]][Q[hed][1]]=0;
for(int k=0;k<4;k++){
if(check(Q[hed][0]+flg[k][0],Q[hed][1]+flg[k][1]))continue;
int d=(a[Q[hed][0]][Q[hed][1]]!=a[Q[hed][0]+flg[k][0]][Q[hed][1]+flg[k][1]]);
if(dis[Q[hed][0]][Q[hed][1]]+d<dis[Q[hed][0]+flg[k][0]][Q[hed][1]+flg[k][1]]){
dis[Q[hed][0]+flg[k][0]][Q[hed][1]+flg[k][1]]=dis[Q[hed][0]][Q[hed][1]]+d;
if(!vis[Q[hed][0]+flg[k][0]][Q[hed][1]+flg[k][1]]){
til=(til+1)%(maxn*maxn);
vis[Q[hed][0]+flg[k][0]][Q[hed][1]+flg[k][1]]=1;
Q[til][0]=Q[hed][0]+flg[k][0];Q[til][1]=Q[hed][1]+flg[k][1];
}
}
}
}
return dis[dx][dy];
}
int main(){
freopen("P4554.in","r",stdin);
freopen("P4554.out","w",stdout);
while(1){
scanf("%d%d",&n,&m);
if(n==0||m==0)break;
memset(a,0,sizeof a);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++)a[i][j]=getchar();
}
sx=read()+1;sy=read()+1,dx=read()+1,dy=read()+1;
printf("%d
",spfa());
}
return 0;
}