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

#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=;
const int M=;
int power(int a,int b,int c){int ans=;while(b){if(b%==){ans=(ans*a)%c;b--;}b/=;a=a*a%c;}return ans;}
int vis[N][N];
char w[N][N];
int a[N][N];
int d[][]={-,,,,,-,,};
int n,m,sx,sy,ans=;
bool flag=false;
struct man
{
int x,y;
};
void bfs(int x,int y,int num)
{
memset(vis,,sizeof(vis));
queue<man>q;
while(!q.empty())q.pop();
man s;s.x=x;s.y=y;
q.push(s);
a[x][y]=;
vis[x][y]=;
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==)break;}
for(int i=;i<;i++){
int xx=t.x+d[i][],yy=t.y+d[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&w[xx][yy]!='#'){
if((num==&&a[xx][yy]==)||(num==&&vis[xx][yy]==)) {man k;k.x=xx,k.y=yy;q.push(k);
if(num==) a[xx][yy]=;
else vis[xx][yy]=;}
}
}
}
else if(w[t.x][t.y]=='-'){
for(int i=;i<;i++){
int xx=t.x+d[i][],yy=t.y+d[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&w[xx][yy]!='#'){
if((num==&&a[xx][yy]==)||(num==&&vis[xx][yy]==)) {man k;k.x=xx,k.y=yy;q.push(k);
if(num==) a[xx][yy]=;
else vis[xx][yy]=;}
}
}
}
else if(w[t.x][t.y]=='|'){
for(int i=;i<;i++){
int xx=t.x+d[i][],yy=t.y+d[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&w[xx][yy]!='#'){
if((num==&&a[xx][yy]==)||(num==&&vis[xx][yy]==)) {man k;k.x=xx,k.y=yy;q.push(k);
if(num==) a[xx][yy]=;
else vis[xx][yy]=;}
}
}
}
else if(w[t.x][t.y]=='.'){
for(int i=;i<;i++){
int xx=t.x+d[i][],yy=t.y+d[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&w[xx][yy]!='#'){
if((num==&&a[xx][yy]==)||(num==&&vis[xx][yy]==)) {man k;k.x=xx,k.y=yy;q.push(k);
if(num==) a[xx][yy]=;
else vis[xx][yy]=;}
}
}
}
}
}
int main()
{
memset(a,,sizeof(a));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)scanf("%s",w[i]);
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(w[i][j]=='S')sx=i,sy=j;
}
}
bfs(sx,sy,);
if(!flag){puts("I'm stuck!");exit();}
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(a[i][j]){
flag=false;
bfs(i,j,);
if(!flag)ans++;
} }
}
cout<<ans<<endl;
return ;
}

I’m stuck!(BFS)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. xcode6 ios launchimage

    1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image" 2.右侧的勾选可以让你选择是否要对ipad,横屏,竖屏,以及低版本的ios系 ...

  2. JDBC Thin Driver 的formats三种格式

    格式一:  Oracle JDBC Thin using a ServiceName: jdbc:oracle:thin:@//<host>:<port>/<servic ...

  3. Vm下 linux与windowsxp文件共享的方法

    我的PC Operating System Host是Windows XP,Guest是Linux,virtualPC是VMware workstation.方法介绍大全请参见:Windows与Vmw ...

  4. stm32定义GPIO口方向和操作的代码

    #include "stm32f10x.h" #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+(( ...

  5. 移动设备和SharePoint 2013 - 第4部分:定位

    博客地址:http://blog.csdn.net/foxdave 原文地址 在该系列文章中,作者展示了SharePoint 2013最显著的新功能概观--对移动设备的支持. 该系列文章: 移动设备和 ...

  6. mysql 1067 启动错误!!!

    图二:服务器启动不成功 -- 解决方法

  7. JS 中的五个假值

    1."", undefined, null, 0, NaN 除了这五个假值以外,其他所有值转布尔类型都是true.还有一个特殊的false.

  8. MATLAB连接MySQL数据库

    今天开始看<MATLAB数据分析与挖掘实战>,学习了下用MATLAB连接MySQL数据库,环境win7,32bit,MySQL5.7.12,MATLAB2013B 首先,从这里下载驱动的压 ...

  9. CRM客户关系管理系统 ——客户联系人添加(十五)

    需求描述: 1.业务员自己可以查看属于自己的客户信息 2.客服部经理可以查看查看所有客户信息 3.其他人员不得查看客户信息 效果截图:  

  10. ios即时通讯客户端开发之-mac上搭建openfire服务器

    一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfir ...