I’m stuck!

Posted barriery

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I’m stuck!相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于I’m stuck!的主要内容,如果未能解决你的问题,请参考以下文章

CCF 201312-5 I’m stuck!

CCF-I'm stuck!(BFS)

I’m stuck!题解

I’m stuck!

CCF 201312-5 I’m stuck!

转义 Python 字符串中的特殊字符