I’m stuck!(BFS)
Posted 贱人方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I’m stuck!(BFS)相关的知识,希望对你有一定的参考价值。
I’m stuck!
给定一个R行C列的地图,地图的每一个方格可能是\'#\', \'+\', \'-\', \'|\', \'.\', \'S\', \'T\'七个字符中的一个,分别表示如下意思:
\'#\': 任何时候玩家都不能移动到此方格;
\'+\': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非\'#\'方格移动一格;
\'-\': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非\'#\'方格移动一格;
\'|\': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非\'#\'方格移动一格;
\'.\': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为\'#\',则玩家不能再移动;
\'S\': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非\'#\'方格移动一格;
\'T\': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非\'#\'方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个\'S\'和一个\'T\'。
5 5
--+-+
..|#.
..|##
S-+-T
####.
如果把满足性质的方格在地图上用\'X\'标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define inf 0x3f3f3f3f #define mod 10000 typedef long long ll; using namespace std; const int N=55; const int M=300005; int power(int a,int b,int c){int ans=1;while(b){if(b%2==1){ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;} int vis[N][N]; char w[N][N]; int a[N][N]; int d[4][2]={-1,0,1,0,0,-1,0,1}; int n,m,sx,sy,ans=0; bool flag=false; struct man { int x,y; }; void bfs(int x,int y,int num) { memset(vis,0,sizeof(vis)); queue<man>q; while(!q.empty())q.pop(); man s;s.x=x;s.y=y; q.push(s); a[x][y]=1; vis[x][y]=1; while(!q.empty()){ man t=q.front();q.pop(); if(w[t.x][t.y]==\'+\'||w[t.x][t.y]==\'S\'||w[t.x][t.y]==\'T\'){ if(w[t.x][t.y]==\'T\'){flag=true;if(num==2)break;} for(int i=0;i<4;i++){ int xx=t.x+d[i][0],yy=t.y+d[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!=\'#\'){ if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k); if(num==1) a[xx][yy]=1; else vis[xx][yy]=1;} } } } else if(w[t.x][t.y]==\'-\'){ for(int i=2;i<4;i++){ int xx=t.x+d[i][0],yy=t.y+d[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!=\'#\'){ if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k); if(num==1) a[xx][yy]=1; else vis[xx][yy]=1;} } } } else if(w[t.x][t.y]==\'|\'){ for(int i=0;i<2;i++){ int xx=t.x+d[i][0],yy=t.y+d[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!=\'#\'){ if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k); if(num==1) a[xx][yy]=1; else vis[xx][yy]=1;} } } } else if(w[t.x][t.y]==\'.\'){ for(int i=1;i<2;i++){ int xx=t.x+d[i][0],yy=t.y+d[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]!=\'#\'){ if((num==1&&a[xx][yy]==0)||(num==2&&vis[xx][yy]==0)) {man k;k.x=xx,k.y=yy;q.push(k); if(num==1) a[xx][yy]=1; else vis[xx][yy]=1;} } } } } } int main() { memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++)scanf("%s",w[i]); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(w[i][j]==\'S\')sx=i,sy=j; } } bfs(sx,sy,1); if(!flag){puts("I\'m stuck!");exit(0);} for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(a[i][j]){ flag=false; bfs(i,j,2); if(!flag)ans++; } } } cout<<ans<<endl; return 0; }
以上是关于I’m stuck!(BFS)的主要内容,如果未能解决你的问题,请参考以下文章