dlut1188(wanghang的迷宫)
题目链接:传送门
题目大意:从起点到终点需要最少多少步(必须要关掉所有开关才能出去)
题目思路:用一个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的迷宫)的更多相关文章
- NEU710(wanghang走迷宫)
题目链接:传送门 题目大意:给你一个图,要从起点走到终点并且要吃够足够的金币才能出去,图上有金币(只能吃一次), 有传送门(用一次消耗1金币,必须有金币才能使用),问最少需要多少步才能出去.不能出去输 ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- BFS_Maze_求解迷宫最短路径
/* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...
- 【刷题笔记】I'm stuck! (迷宫)-----java方案
题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- HTML 迷宫
今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...
- 洛谷P1605 迷宫——S.B.S.
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- Java迷宫游戏
缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...
随机推荐
- struts.xml 文件添加DTD文件
在编辑struts.xml 文件时,“alt + /”无提示信息,需要在myeclipse 中添加消息头中的文件,步骤如下: 1. 选中该段复制 2. Preferences——>XML Cat ...
- css-id选择器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 在windows 2008 R2上安装sharepoint 2013时遇到提示必须安装 .netframeword4.5的处理办法
近日,有个客户需要个测试环境,需要搭建一个sps2013的测试服务器 但基于服务器软件授权的考虑,让使用windows2008 作为系统服务器 但一安装就碰到个提示,要求先安装framework4.5 ...
- 在项目中增加自定义icon图标
以MUI框架为例,内容来自于MUI官网. mui如何增加自定义icon图标 mui框架遵循极简原则,在icon图标集上也是如此,mui仅集成了原生系统中最常用的图标:其次,mui中的图标并不是图片,而 ...
- FreeSWITCH小结:关于sip的UDP、TCP与MTU
1.关于SIP的UDP与MTU的关系 如果sip消息的大小超过了MTU,则有可能被网络中的某一节点分片,而UDP处理分片会有很大的问题,从而导致sip消息传输失败.要解决该问题的话,两种方案: 1)减 ...
- [elk]kibana搜索绘图
kibana绘图 好些日志入库了需要分析. 1,首先分析top10 url的table和柱状分布 2,其次想着分析下404所占比例,以及404所对应的url table. 3,最后分析一下请求总数. ...
- rdb 和 aof
Redis 中 默认会开启rdb 持久化方式,aof 默认不开启,Redis 提供不同级别的持久化方式rdb: 在指定的时间间隔对你的数据进行快照存储aof:记录每次Redis服务写操作,当Redis ...
- ImageTag小案例
其实不使用ImageIO,就是用一般的BufferedOutputStream+byte[] buffer也可以 关键在于通过response设置页面的MIME Type,自行Google~~~ 源代 ...
- java list map转换成二维数组
/** * *@Title: ListToArray *@Description: list列表转换成二维数组 *@Author: Administrator *@Since: 2018年1月7日下午 ...
- Android最流行的网络框架(原创)
Android程序最重要的模块就是网络部分,如何从网络上下载数据,如何将处理过的数据上传至网络,往往是android程序的关键环节. Android原生提供基于HttpClient和Ht ...