BZOJ2464 中山市选2009小明的游戏 SPFA

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




猜你喜欢

转载自blog.csdn.net/wolf_reiser/article/details/78943765