| 试题编号: | 201312-5 |
| 试题名称: | I’m stuck! |
| 时间限制: | 1.0s |
| 内存限制: | 256.0MB |
| 问题描述: |
问题描述
给定一个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 |
这个题由于数据量特别小所以有些简单,最大50*50的数组,用两次BFS复杂度在n^2的数量级2500*2500<<10^8.
代码写的有些糙,因为刚开始没想到这么简单用的简单的方法,但是可能逻辑上存在一些漏洞,一直是20分,于是才发现只有50行…………
#include <iostream>#include<algorithm>#include<queue>#include<string.h>bool mazes[100][100];using namespace std;int maze1[100][100];bool mazet[100][100];int M,N; int i,j;int sx,sy,tx,ty;struct zuobiao{zuobiao zuobiaos[4]{zuobiao(-1,0),zuobiao(1,0),zuobiao(0,-1),zuobiao(0,1)}; zuobiao(int x,int y):i(x),j(y){}};
bool bfss(int x,int y){ que.push(zb); zuobiao zb(x,y); queue<zuobiao>que; mazes[x][y]=1; while(!que.empty()) switch (maze1[tmpi][tmpj]) { zb=que.front(); que.pop(); int tmpi=zb.i,tmpj=zb.j; { if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& case 1: for(int i=0;i<4;i++) { if(!mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) { mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) { break; zb.i=tmpi+zuobiaos[i].i; zb.j=tmpj+zuobiaos[i].j; } que.push(zb); }
}
{ case 2: for(int i=2;i<4;i++) if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& { tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; if(!mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& { zb.i=tmpi+zuobiaos[i].i; zb.j=tmpj+zuobiaos[i].j; que.push(zb); } } }
{ break;
case 3:
for(int i=0;i<2;i++) mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) { if(!mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& { zb.i=tmpi+zuobiaos[i].i; que.push(zb); zb.j=tmpj+zuobiaos[i].j; }
}
{ } break; case 4: for(int i=1;i<2;i++) mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) { if(!mazes[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) memset(mazet,0,sizeof(mazet)); { zb.i=tmpi+zuobiaos[i].i; zb.j=tmpj+zuobiaos[i].j; que.push(zb); } } }
return true; break;
}
if(mazes[tx][ty]) }
{
zuobiao zb(x,y); }
else
return false;}
bool bfst(int x,int y){
queue<zuobiao>que;
tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) mazet[x][y]=1; que.push(zb); while(!que.empty()) { zb=que.front(); int tmpi=zb.i,tmpj=zb.j; que.pop(); case 1: switch (maze1[tmpi][tmpj]) {
if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& for(int i=0;i<4;i++) {
{
que.push(zb); if(!mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; { zb.i=tmpi+zuobiaos[i].i; } zb.j=tmpj+zuobiaos[i].j; }
}
mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; break;
case 2: for(int i=2;i<4;i++) { if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) {
maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) if(!mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& {
zb.i=tmpi+zuobiaos[i].i;
if(!mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& zb.j=tmpj+zuobiaos[i].j; que.push(zb); } } }
{ break;
case 3:
for(int i=0;i<2;i++) tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& {
tmpj+zuobiaos[i].j>=0&&tmpj+zuobiaos[i].j<=N) maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) {
mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; zb.i=tmpi+zuobiaos[i].i; que.push(zb); zb.j=tmpj+zuobiaos[i].j; }
}
{ } break; case 4: for(int i=1;i<2;i++) if(!mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]&& if(tmpi+zuobiaos[i].i>=0&&tmpi+zuobiaos[i].i<=M&& {
memset(mazes,0,sizeof(mazes)); maze1[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]!=0) { mazet[tmpi+zuobiaos[i].i][tmpj+zuobiaos[i].j]=1; zb.i=tmpi+zuobiaos[i].i; } zb.j=tmpj+zuobiaos[i].j; que.push(zb);
return 1; } }
break; }
}
if(mazet[tx][ty])
else
return 0;}
int main()
{
memset(maze1,0,sizeof(maze1)); memset(mazet,0,sizeof(mazet));
sx=i; char tmp; cin>>M>>N; for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { cin>>tmp; { switch(tmp) case '#': case '+': maze1[i][j]=0; break;
maze1[i][j]=2; maze1[i][j]=1; break;
break; case '-':
break;
case '|': maze1[i][j]=3;
case 'S': case '.': maze1[i][j]=4; break;
} sy=j;
maze1[i][j]=1; break; tx=i; case 'T': ty=j;
break; maze1[i][j]=1; }
}
}
int sum=0; if(!bfss(sx,sy)) {
cout<<"I'm stuck!"; return 0;
}
if(mazes[i][j]) for(int i=0;i<M;i++) {
for(int j=0;j<N;j++) {
{
} if(!bfst(i,j)) {
} sum++;
}
return 0; }
cout<<sum;
4083



被折叠的 条评论
为什么被折叠?



