View Code of Problem 2597

#include<iostream>
#include<cstdio>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
int n,m;
int c,b;
struct Rou{
	char pos;
	int x;
	int y;
	int step;
};
bool isvis[500][500];
char a[500][500];
queue<Rou>q;
int bfs(){
		Rou first;
		first.x=c;
		first.y=b;
		first.step=0;
		first.pos='S';
		q.push(first);
		isvis[first.x][first.y]=true;
		while(!q.empty()){
			Rou cur=q.front();
			q.pop();
			if(cur.pos=='E'){
				return cur.step;
			}
			else{
					if(isvis[cur.x+1][cur.y]==false&&cur.x+1<=n&&a[cur.x+1][cur.y]!='#'){
						Rou neighbor;
						neighbor.pos=a[cur.x+1][cur.y];
						neighbor.step=cur.step+1;
						neighbor.x=cur.x+1;
						neighbor.y=cur.y+0;
						isvis[cur.x+1][cur.y]=true;
						q.push(neighbor);
					}
					if(isvis[cur.x][cur.y+1]==false&&cur.y+1<=m&&a[cur.x][cur.y+1]!='#'){
						Rou neighbor;
						neighbor.pos=a[cur.x][cur.y+1];
						neighbor.step=cur.step+1;
						neighbor.x=cur.x;
						neighbor.y=cur.y+1;
						isvis[cur.x][cur.y+1]=true;
						q.push(neighbor);
					}
					if(isvis[cur.x-1][cur.y]==false&&cur.x-1>=1&&a[cur.x-1][cur.y]!='#'){
						Rou neighbor;
						neighbor.pos=a[cur.x-1][cur.y];
						neighbor.step=cur.step+1;
						neighbor.x=cur.x-1;
						neighbor.y=cur.y+0;
						isvis[cur.x-1][cur.y]=true;
						q.push(neighbor);
					}
					if(isvis[cur.x][cur.y-1]==false&&cur.y-1>=1&&a[cur.x][cur.y-1]!='#'){
						Rou neighbor;
						neighbor.pos=a[cur.x][cur.y-1];
						neighbor.step=cur.step+1;
						neighbor.x=cur.x;
						neighbor.y=cur.y-1;
						isvis[cur.x][cur.y-1]=true;
						q.push(neighbor);
					}
				}
			}
		return 0;
}
int main(){
	while(scanf("%d %d\n",&n,&m)!=EOF){
		memset(isvis,false,sizeof(isvis));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				scanf("%c",&a[i][j]);
				if(a[i][j]=='S'){
					c=i;
					b=j;
				}
			}
			getchar();
		}
		int ans=bfs();
		printf("%d\n",ans);
	}
}

Double click to view unformatted code.


Back to problem 2597