View Code of Problem 2597

#include<iostream>
#include<queue>
#include<string>
#include<cstdio>
using namespace std;
struct Route{
	int x;
	int y;
	int step;
	char pos;
};
char a[500][500];
bool isvis[500][500];
queue<Route>myqueue;
int main(){
	int n,m;
	Route first;
	cin>>n>>m;
	char s;
	for(int i=0;i<500;i++){
		for(int j=0;j<500;j++){
			isvis[i][j]=false;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>s;
			a[i][j]=s;
			if(s=='S'){
				first.x=i;
				first.y=j;
			}
		}
	}
	if(n==1 && m==1){
		cout<<1<<endl;
	}
	first.pos=a[first.x][first.y];
	first.step=0;
	myqueue.push(first);
	isvis[first.x][first.y]=true;
	while(!myqueue.empty()){
		Route cur=myqueue.front();
		myqueue.pop();
		if(cur.pos=='E'){
			cout<<cur.step<<endl;break;
		}
		else{
			if(isvis[cur.x+1][cur.y]==false && cur.x+1<=n && a[cur.x+1][cur.y]!='#'){
				Route neighbor;
				neighbor.x=cur.x+1;
				neighbor.y=cur.y;
				neighbor.step=cur.step+1;
				neighbor.pos=a[neighbor.x][neighbor.y];
				isvis[neighbor.x][neighbor.y]=true;
				myqueue.push(neighbor);
			}
			if(isvis[cur.x][cur.y+1]==false && cur.y+1<=m && a[cur.x][cur.y+1]!='#'){
				Route neighbor;
				neighbor.x=cur.x;
				neighbor.y=cur.y+1;
				neighbor.step=cur.step+1;
				neighbor.pos=a[neighbor.x][neighbor.y];
				isvis[neighbor.x][neighbor.y]=true;
				myqueue.push(neighbor);
			}
			if(isvis[cur.x-1][cur.y]==false && cur.x-1>=1 && a[cur.x-1][cur.y]!='#'){
				Route neighbor;
				neighbor.x=cur.x-1;
				neighbor.y=cur.y;
				neighbor.step=cur.step+1;
				neighbor.pos=a[neighbor.x][neighbor.y];
				isvis[neighbor.x][neighbor.y]=true;
				myqueue.push(neighbor);
			}
			if(isvis[cur.x][cur.y-1]==false && cur.y-1>=1 && a[cur.x][cur.y-1]!='#'){
				Route neighbor;
				neighbor.x=cur.x;
				neighbor.y=cur.y-1;
				neighbor.step=cur.step+1;
				neighbor.pos=a[neighbor.x][neighbor.y];
				isvis[neighbor.x][neighbor.y]=true;
				myqueue.push(neighbor);
			}
		}
	}
}

Double click to view unformatted code.


Back to problem 2597