zoukankan      html  css  js  c++  java
  • 最短路【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
    ",dis[(tx-1)*m+ty]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Java学习第一篇废话写在前面
    使用UI Automation实现自动化测试7.2 (模拟键盘复杂操作在自动化测试中的应用)
    生活随想之 积累经验篇
    赌一把
    重启职业及生存旅途计划
    partial class在自动化测试中的使用
    您们用什么广告平台
    Crazy English 900 Expressions (Android App)
    生存之道
    个税计算器完美终极版
  • 原文地址:https://www.cnblogs.com/wangxiaodai/p/9818102.html
Copyright © 2011-2022 走看看