标签:
I’m stuck!
问题描述
给定一个R行C列的地图,地图的每一个方格可能是‘#‘, ‘+‘, ‘-‘, ‘|‘, ‘.‘, ‘S‘, ‘T‘七个字符中的一个,分别表示如下意思:
‘#‘: 任何时候玩家都不能移动到此方格;
‘+‘: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格;
‘-‘: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非‘#‘方格移动一格;
‘|‘: 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非‘#‘方格移动一格;
‘.‘: 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为‘#‘,则玩家不能再移动;
‘S‘: 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格;
‘T‘: 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入格式
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个‘S‘和一个‘T‘。
输出格式
如果玩家在初始位置就已经不能到达终点了,就输出“I‘m stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
--+-+
..|#.
..|##
S-+-T
####.
样例输出
2
样例说明
如果把满足性质的方格在地图上用‘X‘标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
BFS
此题就是BFS的变形,但是我不太清楚为什么我就拿了40分...(40/100)
代码如下:
1 #include<cstdio> 2 #include<queue> 3 #include<iostream> 4 #include<cstring> 5 #define N 51 6 using namespace std; 7 typedef pair<int,int> P; 8 queue<P>point; 9 char mp[N][N]; 10 int mark[N][N]; 11 int r,c; 12 P s,t; 13 int sum=0,psum; 14 int dx[]={-1,1,0,0}; 15 int dy[]={0,0,-1,1}; 16 void bfs(P start,int mark[][N]); 17 int main(void){ 18 scanf("%d%d\n",&r,&c); 19 char temp; 20 for(int i=0;i<r;++i){ 21 for(int j=0;j<c;++j){ 22 scanf("%c",&mp[i][j]); 23 if(mp[i][j]==‘S‘){ 24 s.first=i; 25 s.second=j; 26 }else if(mp[i][j]==‘T‘){ 27 t.first=i; 28 t.second=j; 29 }else if(mp[i][j]==‘.‘){ 30 point.push(make_pair(i,j)); 31 } 32 } 33 scanf("%c",&temp); 34 } 35 36 bfs(s,mark); 37 38 if(mark[t.first][t.second]){ 39 while(!point.empty()){ 40 P p=point.front(); 41 point.pop(); 42 int px=p.first; 43 int py=p.second; 44 if(mark[px][py]){ 45 int pmark[N][N]; 46 memset(pmark,0,sizeof(pmark)); 47 bfs(p,pmark); 48 if(!pmark[t.first][t.second]){ 49 for(int i=0;i<r;++i){ 50 for(int j=0;j<c;++j){ 51 mark[i][j]+=pmark[i][j]; 52 } 53 } 54 } 55 } 56 } 57 for(int i=0;i<r;++i){ 58 for(int j=0;j<c;++j){ 59 if(mark[i][j]>1){ 60 sum++; 61 } 62 } 63 } 64 printf("%d\n",sum); 65 }else{ 66 printf("I‘m stuck!\n"); 67 } 68 69 } 70 void bfs(P start,int Mark[][N]){ 71 queue<P>q; 72 q.push(start); 73 while(!q.empty()){ 74 P temp=q.front(); 75 q.pop(); 76 int tx=temp.first; 77 int ty=temp.second; 78 Mark[tx][ty]=1; 79 if(mp[tx][ty]==‘+‘||mp[tx][ty]==‘S‘||mp[tx][ty]==‘T‘){ 80 for(int i=0;i<4;++i){ 81 int x=tx+dy[i]; 82 int y=ty+dx[i]; 83 if(0<=x&&x<r&&0<=y&&y<c&&!Mark[x][y]&&mp[x][y]!=‘#‘){ 84 q.push(make_pair(x,y)); 85 } 86 } 87 }else if(mp[tx][ty]==‘-‘){ 88 for(int i=0;i<2;++i){ 89 int x=tx+dy[i]; 90 int y=ty+dx[i]; 91 if(0<=x&&x<r&&0<=y&&y<c&&!Mark[x][y]&&mp[x][y]!=‘#‘){ 92 q.push(make_pair(x,y)); 93 } 94 } 95 }else if(mp[tx][ty]==‘|‘){ 96 for(int i=2;i<4;++i){ 97 int x=tx+dy[i]; 98 int y=ty+dx[i]; 99 if(0<=x&&x<r&&0<=y&&y<c&&!Mark[x][y]&&mp[x][y]!=‘#‘){ 100 q.push(make_pair(x,y)); 101 } 102 } 103 }else if(mp[tx][ty]==‘.‘){ 104 int x=tx+1; 105 int y=ty; 106 if(0<=x&&x<r&&0<=y&&y<c&&!Mark[x][y]&&mp[x][y]!=‘#‘){ 107 q.push(make_pair(x,y)); 108 } 109 } 110 } 111 }
标签:
原文地址:http://www.cnblogs.com/barrier/p/5612898.html