I’m stuck!(BFS)
I’m stuck!
给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:
'#': 任何时候玩家都不能移动到此方格;
'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;
'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;
'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;
'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
5 5
--+-+
..|#.
..|##
S-+-T
####.
如果把满足性质的方格在地图上用'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)的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- CodeForces 468A Program F
Description Little X used to play a card game called "24 Game", but recently he has found ...
- Opencv中在图片上显示文本
1.cvPutText函数(在图像中加入文本) void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* fon ...
- 项目管理软件---redmine安装配置
redmine是一个开源的项目管理软件,其主页是:http://www.redmine.org redmine是基于Ruby on Rails框架的,跨平台和跨数据库. 安装过程 ========== ...
- ODI 12.1.3发布,提升支持大数据的能力
此次发布的ODI新版本,目的是更好的支持当前市场上的大数据平台. 大数据基因在不改变ODI工作效率的情况下,ODI增加了越来越多的数据源集成能力.ODI是在Oracle平台上标准的E-LT工具,事实上 ...
- Android开发-略讲adb命令和SQLite数据库运用
adb.exe ADB -Android Debug Bridge, 是 Android sdk 里的一个工具,用这个工具可以直接操作管理 Android 模拟器或者真实的 Android 设备 简 ...
- AlarmManager
转自:http://blog.csdn.net/wangxingwu_314/article/details/8060312 1.AlarmManager,顾名思义,就是“提醒”,是Android中常 ...
- 03-树2 Tree Traversals Again
这题是第二次做了,两次都不是独立完成,不过我发现我第一次参考的程序,也是参考老师(陈越)的范例做出来的.我对老师给的做了小幅修改,因为我不想有全局变量的的存在,所以我多传了三个参数进去.正序遍历每次都 ...
- JS 基础事件的用法
// 1.9以上用on // 案例一 // $('#btn').on('click', function(){ // //console.log(1); // alert('测试...'); // } ...
- python3爬虫再探之EXCEL(续)
上篇介绍了xlsxwriter的用法,本来想写一下xlrd和xlwt的用法,看到这篇文章——http://blog.csdn.net/wangkai_123456/article/details/50 ...
- MySQL数据库系统概述
了解MySQL数据库管理系统,内容如下: 一.基于数据库的PHP项目 目前动态网站都是基于数据库,将网站内容使用数据库管理系统去管理 用户, 栏目, 图片, 文章, 评论都 ...