1754. 逃离洞穴

    xiaoxiao2021-12-02  45

    基础bfs题目的变形,在结构体里设定答案,在状态更新后才进行判断。两个基础的bfs.

    #include <iostream> #include <cstring> #include <queue> using namespace std; int const maxn = 2000; int vis[maxn][maxn]; int rr,cc; char map[maxn][maxn]; int er,ec; int dr[] ={0,-1,0,1}; int dc[]= {1,0,-1,0}; struct point { int r,c; int val; point(int _r=0,int _c=0,int _val=0):r(_r),c(_c),val(_val){} bool operator== (const point& tmp) { return r==tmp.r&&c==tmp.c; } bool isle() { return r>=1&&r<=rr&&c<=cc&&c>=1; } bool isvis() { return vis[r][c]; } bool isgo() { if(map[r][c]=='.') return 1; else return 0; } bool isde() { return r==er&&c==ec; } }; queue<point> D; queue<point> P; int bfs() { int k; while (!P.empty()) { if(!D.empty()) k=D.front().val; while(!D.empty()&&D.front().val==k) { for (int i=0;i<4;i++) { point pp(D.front().r+dr[i],D.front().c+dc[i],D.front().val+1); if(pp.isle()&&!pp.isde()&&pp.isgo()) { map[pp.r][pp.c] = 'X'; D.push(pp); } } D.pop(); } if (!P.empty()) k=P.front().val; while (!P.empty()&&P.front().val==k) { for(int i=0;i<4;i++) { point pp(P.front().r+dr[i],P.front().c+dc[i],P.front().val+1); if(pp.isde()) return pp.val; if (pp.isle()&&!pp.isvis()&&pp.isgo()) { vis[pp.r][pp.c] = 1; P.push(pp); } } P.pop(); } } return 0; } int main() { while(cin>>rr>>cc&&rr){ while (!D.empty()) D.pop(); while (!P.empty()) P.pop(); memset(vis,0,sizeof(vis)); for (int i=1;i<=rr;i++) for (int j=1;j<=cc;j++) { cin>>map[i][j]; if(map[i][j]=='D') { map[i][j]='X'; D.push(point(i,j,0)); } if(map[i][j]=='P') { map[i][j]='.'; vis[i][j]=1; P.push(point(i,j,0)); } if(map[i][j]=='E') { er=i;ec=j; map[i][j]='.'; } } int ans = bfs(); if (ans) cout<<ans<<endl; else cout<<"YYR is extremely dangerous!"<<endl; } }

    这个代码还没过,不知道哪里错了,以后再修正。

    #include <iostream> #include <string.h> #include <queue> #include <stack> #include <vector> using namespace std; int r,c; const int maxn = 2000; int map[maxn][maxn]; int vis[maxn][maxn]; int dr[] ={0,-1,0,1}; int dc[]= {1,0,-1,0}; struct point { int r; int c; point(int a=0,int b=0):r(a),c(b){} bool operator==(const point& tmp) { return r==tmp.r&&c==tmp.c; } }E; queue<point> Q1; queue<point> D; void bfs_d() { stack<point> s; while (!D.empty()) { s.push(D.front()); D.pop(); } while(!s.empty()) { for (int i=0;i<4;i++) { int nr=s.top().r+dr[i]; int nc=s.top().c+dc[i]; if(nr>=1&&nr<=r&&nc>=1&&nc<=c) { if(map[nr][nc]&&!(nr==E.r&&nc==E.c)) { map[nr][nc]=0; D.push(point(nr,nc)); } } } s.pop(); } } int bfs_p() { stack<point> s; if(Q1.empty()) return -1; while(!Q1.empty()) { s.push(Q1.front()); Q1.pop(); } while(!s.empty()) { for(int i=0;i<4;i++) { int nr=s.top().r+dr[i]; int nc=s.top().c+dc[i]; if(nr==E.r&&nc==E.c) return 1; if(nr>=1&&nr<=r&&nc>=1&&nc<=c) { if(map[nr][nc]&&!vis[nr][nc]) { Q1.push(point(nr,nc)); vis[nr][nc]=1; } } } s.pop(); } } int bfs() { int k=1; if (D.front()==E) return 0; while (1) { bfs_d(); int t = bfs_p(); if(t==-1) return -1; if(t==1) return k; k++; } } int main() { while(cin>>r>>c&&r) { memset(vis,0,sizeof(vis)); while(!Q1.empty()) Q1.pop(); while(!D.empty()) D.pop(); for (int i=1;i<=r;i++) for (int j=1;j<=c;j++) { char ch; cin>>ch; if(ch=='X') map[i][j]=0; if(ch=='.') map[i][j]=1; if(ch=='D') { D.push(point(i,j)); map[i][j]=0;} if(ch=='E') { E.r=i; E.c=j; map[i][j]=1; } if(ch=='P') { Q1.push(point(i,j));map[i][j]=1;vis[i][j]=1;} } int ans = bfs(); if(ans!=-1) cout<<ans<<endl; else cout<<"YYR is extremely dangerous!"<<endl; } }
    转载请注明原文地址: https://ju.6miu.com/read-679791.html

    最新回复(0)