题目链接:传送门

题目大意:从起点到终点需要最少多少步(必须要关掉所有开关才能出去)

题目思路:用一个3维数组   dp[x][y][t]表示到达当前位置x,y,已经关掉了t个开关走的最少步数,然后就是bfs搜索

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 1000010
#define maxn 400005
typedef pair<int,int> PII; int n,m,sx,sy;
char pic[][];
int dp[][][]; ///记录在关掉t个开关的情况下走到当前位置用得最少步数
int dir[][]={{,},{-,},{,},{,-}};
struct Node{
int x,y,t,v; ///v记录步数,t记录关掉的开关数目
int vi[]; ///判断当前状态哪些开关已经关掉了
void ini(){mst(vi,);v=t=;}
}node,temp;
void bfs(){
mst(dp,inf);
dp[node.x][node.y][]=;
queue<Node>q;q.push(node);
while(!q.empty()){
node=q.front();q.pop();
if(pic[node.x][node.y]=='E'){
if(node.t==){
dp[node.x][node.y][]=min(dp[node.x][node.y][],node.v);
}
continue;
}
for(int i=;i<;++i){
int xx=node.x+dir[i][];
int yy=node.y+dir[i][];
if(xx<||yy<||xx>n||yy>m||pic[xx][yy]=='#')continue;
temp=node;temp.x=xx;temp.y=yy;
temp.v++;
if(pic[xx][yy]=='A'&&!temp.vi[]){
temp.vi[]=;
temp.t++;
}
else if(pic[xx][yy]=='B'&&!temp.vi[]){
temp.vi[]=;
temp.t++;
}
else if(pic[xx][yy]=='C'&&!temp.vi[]){
temp.vi[]=;
temp.t++;
}
if(dp[xx][yy][node.t]>temp.v){
dp[xx][yy][node.t]=temp.v;
q.push(temp);
}
}
}
if(dp[sx][sy][]<inf)
printf("%d\n",dp[sx][sy][]);
else printf("-1\n");
}
int main(){
int i,j,group,Case=;
scanf("%d",&group);
while(group--){
node.ini();
scanf("%d%d",&n,&m);
for(i=;i<=n;++i){
scanf("%s",pic[i]+);
for(j=;j<=m;++j){
if(pic[i][j]=='S'){node.x=i;node.y=j;}
else if(pic[i][j]=='E'){sx=i;sy=j;}
}
}
bfs();
}
return ;
}

dlut1188(wanghang的迷宫)的更多相关文章

  1. NEU710(wanghang走迷宫)

    题目链接:传送门 题目大意:给你一个图,要从起点走到终点并且要吃够足够的金币才能出去,图上有金币(只能吃一次), 有传送门(用一次消耗1金币,必须有金币才能使用),问最少需要多少步才能出去.不能出去输 ...

  2. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  3. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  4. BFS_Maze_求解迷宫最短路径

    /* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...

  5. 【刷题笔记】I'm stuck! (迷宫)-----java方案

    题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...

  6. canvas实例 ---- 制作简易迷宫(一)

    这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...

  7. HTML 迷宫

    今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...

  8. 洛谷P1605 迷宫——S.B.S.

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  9. Java迷宫游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...

随机推荐

  1. zabbix_get :command not found 解决办法

    zabbix_get 找不到命令是因为没有安装上zabbix_get ,解决办法: 1.yum list all |grep zabbix 返回一个列表,表中出现 zabbix-get.x86_84 ...

  2. Python: 去掉字符串中的非数字(或非字母)字符

    >>> crazystring = ‘dade142.;!0142f[.,]ad’ 只保留数字>>> filter(str.isdigit, crazystring ...

  3. App登录注册功能,怎样做到用户体验最佳?

    用户登录系统,可以细分为三项功能模块,分别是:登录.注册和密码找回.本文作者将结合自身经历,谈谈他在做这块的时候一些想法,主要是涉及业务流程. 登录和注册功能,不论是PC端还是移动端,大多数产品都会涉 ...

  4. python 特征缺失值填充

    python数据预处理之缺失值简单处理:https://blog.csdn.net/Amy_mm/article/details/79799629 该博客总结比较详细,感谢博主. 我们在进行模型训练时 ...

  5. idea 编程字体推荐

    monaco vardana fira code mediu dejavu sans mono 上述字体 在14号字 1.1倍行距 时编程比较舒服

  6. MySQL之mysql客户端工作的批处理一些使用手法

    通常我们会用mysql这个客户端程序来连接mysql库.这个通常是工作在交互式模式下的.如我们连接上mysql并执行如下操作: mysql -uroot -h127. -P3306 Welcome t ...

  7. (转)No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VA 解决办法

    c3dEngine在iphone6模拟器下运行报错No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, V ...

  8. Bash中的括号(二)

    双方括号[[]]的用法: 1.先举个例子说明: 假如你要再判断某个目录是否存在,又想当然写成: $ [ -f exists.txt && -d exists_folder ]; ech ...

  9. redis命令_ZREM

    ZREM key member [member ...] 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略. 当 key 存在但不是有序集类型时,返回一个错误. 在 Redis 2.4 版 ...

  10. JS高程3:错误处理和调试

    浏览器打开控制台的快捷键 Ctrl+shift+I try-catch语句 语法 try{ // 可能会导致错误的代码 } catch(error){ // 在错误发生时怎么处理 } 可以自定义错误信 ...