zoukankan      html  css  js  c++  java
  • P1825 [USACO11OPEN]Corn Maze S

    思路

    利用BFS的性质求最短路
    但是由于存在传送门可能破坏BFS的性质,暂时没有什么证明与HACK(咕咕)

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    using namespace std;
    struct Node{
    	pair<int,int> x;	
    	int dis;
    };
    queue<Node> q;
    int map[2000][2000],vis[2000][2000],dis[2000][2000],n,m;
    int ansx,ansy,sx[26],sy[26],tx[26],ty[26],Sx,Sy,flag=false;
    const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
    void bfs(void){
    	q.push((Node){make_pair(Sx,Sy),0	});
    	while(!q.empty()){
    		Node x=q.front();
    		q.pop();
    		pair<int,int> X = x.x;
    		if(vis[X.first][X.second])
    			continue; 
    		vis[X.first][X.second]=true;
    		if(X.first==ansx&&X.second==ansy){
    			printf("%d
    ",x.dis);
    			return;
    		}
    		for(int i=0;i<26;i++){
    			if(X.first==sx[i]&&X.second==sy[i]){
    				X.first=tx[i];
    				X.second=ty[i];
    				break;
    			}
    			else if(X.first==tx[i]&&X.second==ty[i]){
    				X.first=sx[i];
    				X.second=sy[i];
    				break;
    			}
    		}
    		for(int i=0;i<4;i++){
    			if(X.first+dx[i]>=1&&X.first+dx[i]<=n&&X.second+dy[i]>=1&&X.second+dy[i]<=m)
    			if((!vis[X.first+dx[i]][X.second+dy[i]])&&(map[X.first+dx[i]][X.second+dy[i]])){
    				q.push((Node){make_pair(X.first+dx[i],X.second+dy[i]),x.dis+1});
    			}
    		}
    	}
    }
    int main(){
    	scanf("%d %d",&n,&m);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++){
    			char c;
    			c=getchar();
    			while(c!='#'&&c!='.'&&c!='@'&&c!='='&&(c<'A'||c>'Z'))
    				c=getchar();
    			if(c=='#')
    				map[i][j]=0;
    			else if(c=='.')
    				map[i][j]=1;
    			else if(c=='@'){
    				map[i][j]=1;
    				Sx=i;
    				Sy=j;
    			}
    			else if(c=='='){
    				map[i][j]=1;
    				ansx=i;
    				ansy=j;
    			}
    			else{
    				map[i][j]=1;
    				if((!sx[c-'A'])&&(!sy[c-'A'])){
    					sx[c-'A']=i;
    					sy[c-'A']=j;
    				}
    				else{
    					tx[c-'A']=i;
    					ty[c-'A']=j;
    				}
    			}
    	}
    	bfs();
    	return 0;
    }
    
  • 相关阅读:
    ffmpeg一些filter使用方法、以及一些功能命令
    Hibernate调试——定位查询源头
    emmet语法
    [心得]传统IT转互联网面试经验分享
    Java中的集合类型的继承关系图
    Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
    oracle求时间差的常用函数
    jdbc读取新插入Oracle数据库Sequence值的5种方法
    Xpath语法格式整理
    Oracle中 Instr 这个函数
  • 原文地址:https://www.cnblogs.com/dreagonm/p/14048768.html
Copyright © 2011-2022 走看看