</pre><pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 35
using namespace std;
int n, m;
char map[maxn][maxn];
bool visit[maxn][maxn];
int dir[4][2] ={-1,0,1,0,0,-1,0,1};
int bx, by;
int ex, ey;
struct point{
int x, y, step;
friend bool operator < (point a, point b){
return a.step>b.step;
}
};
bool check(int x, int y){
// if(x>=1&&x<=n&&y>=1&&y<=m)
if(map[x][y]!='#'&&!visit[x][y]){
return true;
}
return false;
}
int bfs(){
priority_queue<point> q;
point cur, next;
cur.x = bx;
cur.y = by;
cur.step = 0;
q.push(cur);
visit[bx][by]=1;
while(!q.empty()){
cur = q.top();
q.pop();
int x, y;
for(int i = 0; i < 4; i++){
x = cur.x+dir[i][0];
y = cur.y+dir[i][1];
if(check(x,y)){ //满足进一步宽搜的条件
next.x = x;
next.y = y;
next.step = cur.step+1;
if(map[x][y]=='x'){ //满足某条件,改变它的值,这里是优先队列比单纯队列多出来的地方
next.step++;
}else if(x==ex&&y==ey){ //达到目的地
return next.step;
}
visit[x][y] = 1;
q.push(next);
}
}
}
return -1;
}
int main(){
//freopen("in.txt", "r", stdin);
while(cin>>n>>m){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin>>map[i][j];
if(map[i][j]=='S'){
bx = i; by = j;
}else if(map[k][i][j]=='E'){
ex = i; ey = j;
}
}
}
for(int i = 0; i <=m+1; i++){
map[0][i] = '#';
map[n+1][i] = '#';
}
for(int i = 0; i <= n+1; i++){
map[i][0] = '#';
map[i][m+1] = '#';
}
int ans = bfs();
if(ans!=-1)
printf("Escaped in %d minute(s).\n", ans);
else
printf("Trapped!\n");
memset(visit, 0, sizeof(visit));
}
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交