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;
}
原文地址:https://www.cnblogs.com/dreagonm/p/14048768.html