给定一个n * m的棋盘,上面有两种格子#和@。给定一个起始位置和一个目标位置,每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。计算从起始位置移动到目标位置的最小花费。
最短路无误
忘判边界WA两发也是醉了
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=505;
struct node{
int x,y;
}que[N*N*4];
int n,m,x1,y1,x2,y2,vist[N][N],dist[N][N];
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
char mp[N][N];
void spfa()
{
int l=0,r=1;
que[0]=(node){x1,y1};
vist[x1][y1]=1;dist[x1][y1]=0;
while(l<r)
{
int x=que[l].x,y=que[l].y;
l++;vist[x][y]=0;
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||ny<0||nx>=n||ny>=m)continue;
int w=mp[x][y]==mp[nx][ny] ? 0 : 1;
if(dist[nx][ny]>dist[x][y]+w)
{
dist[nx][ny]=dist[x][y]+w;
if(!vist[nx][ny])
vist[nx][ny]=1,que[r++]=(node){nx,ny};
}
}
}
printf("%d\n",dist[x2][y2]);
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n+m==0)break;
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
clr(vist,0);clr(dist,60);
spfa();
}
return 0;
}