Escape(多记一个方向状态的BFS)迷宫逃脱
题意:https://www.nitacm.com/problem_show.php?pid=2266
vis记【x】【y】【dir】三个状态就行。
引用:https://blog.csdn.net/qq_37451344/article/details/80243077
#include<string.h>
#include<stdio.h>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
int x1,y1;
int n,m;
char mat[][];
int vis[][][];
int f[][]={,,,-,-,,,};//左,右,上,下;
struct node{
int x,y;//坐标
int ff;//方向
int temp;
};
int judge(int a,int b,int c,int d)
{//判断符不符合拐弯的条件
if(mat[a][b]=='#'&&mat[c][d]=='#')
{
return ;
}
return ;
}
void bfs()
{
node s,t;
queue<node>q;
s.x=x1;
s.y =y1;
s.temp=;
s.ff=-;//起始方向为-1
vis[x1][y1][]=vis[x1][y1][]=vis[x1][y1][]=vis[x1][y1][]=;
q.push(s);
while(!q.empty())
{
int flag=;
t=q.front();
q.pop();
if((t.x==||t.x==n-||t.y==||t.y==m-))
{//到达边缘
printf("%d\n",t.temp );
return;
}
int x2,x3,y2,y3;
if(t.ff==||t.ff==)
{//当从左,或从右到达t点时,判断上下方向能不能拐弯
x2=t.x+;
y2=t.y;
x3=t.x-;
y3=t.y;
if(judge(x2,y2,x3,y3))
{//如果能拐
for(int i=;i<;i++)
{//向上或向下拐
s.x=t.x+f[i][];
s.y=t.y+f[i][];
s.temp=t.temp+;
s.ff=i;//记录s点从哪个方向过来的
if(s.x>=n||s.x<||s.y>=m||s.y<||vis[s.x][s.y][s.ff]||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y][i]=;
q.push(s);
}
}
else flag=;//不能拐,标记
} else if(t.ff==||t.ff==)
{//从上或下到达t点时,判断左右方向能不能拐弯
x2=t.x;
y2=t.y+;
x3=t.x;
y3=t.y-;
if(judge(x2,y2,x3,y3))
{//能拐
for(int i=;i<;i++)
{//就两个方向,向左或向右拐
s.x=t.x+f[i][];
s.y=t.y+f[i][];
s.temp=t.temp+;
s.ff=i;
if(s.x>=n||s.x<||s.y>=m||s.y<||vis[s.x][s.y][s.ff]||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y][s.ff]=;
q.push(s);
}
}
else flag=;//不能拐,标记
} else if(t.ff==-)
{//这是起点的时候,任意方向都可以
for(int i=;i<;i++)
{
s.x=t.x+f[i][];
s.y=t.y+f[i][];
s.temp=t.temp+;
s.ff=i;
if(s.x>=n||s.x<||s.y>=m||s.y<||vis[s.x][s.y][s.ff]||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y][s.ff]=;
q.push(s);
}
} if(flag==)
{//如果不能拐,就按原方向前进
s.x=t.x+f[t.ff][];
s.y=t.y+f[t.ff][];
s.temp=t.temp+;
s.ff=t.ff;
if(s.x>=n||s.x<||s.y>=m||s.y<||vis[s.x][s.y][s.ff]||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y][s.ff]=;
q.push(s);
}
}
printf("-1\n");
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%s",mat[i]);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(mat[i][j]=='@')
{//起点
x1=i;y1=j;
}
}
if(x1==||x1==n-||y1==||y1==m-)
{//起点在边缘,就是0
printf("0\n");
continue;
}
bfs();
}
return ;
}
Escape(多记一个方向状态的BFS)迷宫逃脱的更多相关文章
- HDU 4634 Swipe Bo 状态压缩+BFS最短路
将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...
- HDU4845(SummerTrainingDay02-C 状态压缩bfs)
拯救大兵瑞恩 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题: 即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边. 有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式.即相当于图中想走的方法有6 ...
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- 【GDOI2015】 推箱子 状态压缩+bfs
请注意$8$是一个美妙的数字 考虑到$8\times 8=64$,而一个unsigned long long是$64$位的,所以考虑用一个$01$状态存储箱子.考虑到箱子能转动,那么四种情况都存一下就 ...
- 好一个Time_Wait状态(TCP/IP)
首先简单介绍一下Time_Wait是个什么鬼: 在TCP/IP协议中,我们都知道有三次握手四次挥手的过程,先来一个简单的图: 各个状态和基本的过程想必了解过TCP/IP协议的人都清楚,本次介绍的主题只 ...
- 每天一个 HTTP 状态码 前言
前前言 在重新开始写博文(其实大多也就最多算是日常笔记小结)之际,就想着从短小精悍的文章入手,就想到了 HTTP 状态码.另外,记得很久之前,看过一个<每天一个 Linux 命令>系列文章 ...
- [Swust OJ 1023]--Escape(带点其他状态的BFS)
解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535 Descript ...
随机推荐
- DB缓存一致性
直接硬核干货,去掉前戏. 方案大致说明 1:假设对redis中存在一对key,value的对应关系是 key=money,value=666 2:当修改线程修改key时先将key设置成value=66 ...
- map初步(由ABBC--->A2BC)
1.题目: Given a string containing only 'A' - 'Z', we could encode it using the following method: 1. Ea ...
- php判断两个数组是否相等
php判断两个数组是否相等 一.总结 一句话总结: php判断两个数组是否相等可以直接上==或者===号 二.php 判断两个数组是否相等 转自或参考:php 判断两个数组是否相等https://ww ...
- 亿级在线系统二三事-网络编程/RPC框架 原创: johntech 火丁笔记 今天
亿级在线系统二三事-网络编程/RPC框架 原创: johntech 火丁笔记 今天
- Swift 循环
循环类型 Swift 语言提供了以下几种循环类型.点击链接查看每个类型的详细描述: 循环类型 描述 for-in 遍历一个集合里面的所有元素,例如由数字表示的区间.数组中的元素.字符串中的字符. fo ...
- sysbench 压测
IP架构 sysbench部署服务器:172.17.100.107 压测服务器:172.17.100.100 MySQL部署目录:/usr/local/mysql 前置工作 1.完成MySQL的安装( ...
- 006-log-logback,slf4j+logback
一.概述 Logback作为流行的log4j项目的继承者.它是由log4j的创始人Ceki Gulcu设计的.它是建立在上十年优质日志系统设计经验之上而产生的产品,即logback,它比所有现有的日志 ...
- mfc判断当前程序是否正在运行
HANDLE hMutex = CreateMutex(NULL,TRUE,_T("appName")); if(hMutex) { if(ERROR_ALREADY_EXISTS ...
- VMware安装Centos7超详细过程
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- Linux 远程登陆图形界面
如果我的解决方案帮助到了你,请随手点亮一颗小红心.如有疑问,可在下方评论区处留言. 利用Xmanager,linux启用XDMCP协议(可直接修改配置文件,也可以采用在Xshell中运行gdmconf ...