Description
小明最近喜欢玩一个游戏。给定一个n * m的棋盘,上面有两种格子#和@。游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。请编程计算从起始位置移动到目标位置的最小花费。
Input
输入文件有多组数据。
输入第一行包含两个整数n,m,分别表示棋盘的行数和列数。
输入接下来的n行,每一行有m个格子(使用#或者@表示)。
输入接下来一行有四个整数x1, y1, x2, y2,分别为起始位置和目标位置。
当输入n,m均为0时,表示输入结束。
Output
对于每组数据,输出从起始位置到目标位置的最小花费。每一组数据独占一行。
spfa求最短路
#include<cstdio> #include<queue> int n,m,x1,y1,x2,y2; char s[505][505]; int l[505][505]; bool in[505][505]; struct pos{ int x,y; }; std::queue<pos>q; int xs[]={-1,0,1,0}; int ys[]={0,-1,0,1}; int main(){ while(1){ scanf("%d%d",&n,&m); if(n+m==0)break; for(int i=1;i<=n;i++)scanf("%s",s[i]+1); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ l[i][j]=2147483647; } } l[++x1][++y1]=0; q.push((pos){x1,y1}); while(!q.empty()){ pos w=q.front();q.pop(); int x=w.x,y=w.y; in[x][y]=0; for(int i=0;i<4;i++){ int xx=x+xs[i],yy=y+ys[i]; if(!s[xx][yy])continue; if(s[xx][yy]!=s[x][y]){ if(l[x][y]+1<l[xx][yy]){ l[xx][yy]=l[x][y]+1; if(!in[xx][yy])q.push((pos){xx,yy}),in[xx][yy]=1; } }else{ if(l[x][y]<l[xx][yy]){ l[xx][yy]=l[x][y]; if(!in[xx][yy])q.push((pos){xx,yy}),in[xx][yy]=1; } } } } printf("%d ",l[x2+1][y2+1]); } return 0; }