给定一个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; }