最短路【bzoj2464】: 中山市选[2009]小明的游戏

2464: 中山市选[2009]小明的游戏

Description

小明最近喜欢玩一个游戏。给定一个n * m的棋盘,上面有两种格子#和@。游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。请编程计算从起始位置移动到目标位置的最小花费。

最短路裸题,不给数据组数啊。

怕超时写BFS求最短路还求错了。。。

直接刚DIJ居然过了。

code:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>

using namespace std;

const int wx=1517*1517;

inline int read(){
	int sum=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
	return sum*f;
}

int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};

int vis[wx],head[wx];
int dis[wx],a[1517][1517];
char c[wx];
int n,m,sx,sy,tx,ty,ans,num;

struct e{
	int nxt,to,dis;
}edge[wx*2];

void add(int from,int to,int dis){
	edge[++num].nxt=head[from];
	edge[num].to=to;
	edge[num].dis=dis;
	head[from]=num;
}

struct node{
	int u,d;
	friend bool operator < (const node& a,const node& b){
		return a.d>b.d;
	}
};

priority_queue<node > q;

void Dij(int s){
	for(int i=1;i<=n*m;i++)dis[i]=0x3f3f3f3f,vis[i]=0;
	dis[s]=0; q.push((node){s,0});
	while(q.size()){
		int u=q.top().u; q.pop();
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dis[v]>dis[u]+edge[i].dis){
				dis[v]=dis[u]+edge[i].dis;
				q.push((node){v,dis[v]});
			}
		}
	}
}

int main(){
	while(1){
		n=read(); m=read();
		if(!n&&!m)break;
		memset(head,0,sizeof head);
		memset(edge,0,sizeof edge);
		num=0;
		ans=0x3f3f3f3f;
		for(int i=1;i<=n;i++){
			scanf("%s",c+1);
			for(int j=1;j<=m;j++){
				a[i][j]=(c[j]=='#');
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				for(int k=1;k<=4;k++){
					int ex=i+dx[k];
					int ey=j+dy[k];
					if(ex<1||ex>n||ey<1||ey>m)continue;
					if(a[ex][ey]!=a[i][j])add((i-1)*m+j,(ex-1)*m+ey,1);
					else add((i-1)*m+j,(ex-1)*m+ey,0); 
				}
			}
		}
		sx=read();sy=read();tx=read();ty=read();
		sx++; sy++; tx++; ty++;
		Dij((sx-1)*m+sy);
		if(dis[(tx-1)*m+ty]==0x3f3f3f3f)dis[(tx-1)*m+ty]=0;
		printf("%d\n",dis[(tx-1)*m+ty]);
	}
	return 0;
}
posted @ 2018-10-19 18:34  _王小呆  阅读(164)  评论(0编辑  收藏  举报