CSP 201312-5 I’m stuck! 两次BFS

试题编号: 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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值