HDU 1429 bfs 状态压缩
原文链接: HDU 1429 bfs 状态压缩
上一篇: HDU 4771 Stealing Harry Potter's Precious
下一篇: HDU 1427 dfs 速算24点
题意:迷宫中,一个起点,一个终点,迷宫中有墙,有门,门的钥匙也在迷宫中某处,只有拿到钥匙才能打开门,问能不能再T步(不含)之内逃出迷宫。
题解:在朴素BFS上增加了钥匙的状态,只有有钥匙才能打开门,总共有不超过10吧钥匙,所以用一个int的整数的二进制即可存储钥匙的状态。碰到门先判断状态,碰到钥匙更新状态
字符串后面有\n,最大长度是21
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>#define LL long long
int const MAX = 1e6 + 1;
int const INF = 1 << 30;
double const EPS = 0.00000001;
using namespace std;char g[21][21];
int n, m, T;
bool vis[20][20][1 << 10];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};struct Node {int x, y, state, step;
};
Node st, t;void setVis(Node &nd){vis[nd.x][nd.y][nd.state] = 1;
}int bfs(){memset(vis, 0, sizeof(vis));queue<Node> q;q.push(st);setVis(st);while (!q.empty()){Node nd = q.front();q.pop();for (int i = 0; i < 4; i++){t.x = nd.x + dir[i][0], t.y = nd.y + dir[i][1];t.step = nd.step + 1, t.state = nd.state;//只将满足条件的加入队列if (t.x < 0 || t.y < 0 || t.x >= n || t.y >= m ||g[t.x][t.y] == '*' || t.step >= T)continue;char c = g[t.x][t.y];if (c == '^'){return t.step;}//如果是门且没有对应的钥匙if (c >= 'A' && c <= 'J' && !(t.state & (1 << (c - 'A'))))continue;//如果是钥匙,更新状态if (c >= 'a' && c <= 'j')t.state |= (1 << (c - 'a'));if (!vis[t.x][t.y][t.state]){q.push(t);setVis(t);}}}return -1;
}
int main(){freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);while (scanf("%d%d%d", &n, &m, &T) == 3){for (int i = 0; i < n; i++){scanf("%s", g[i]);for (int j = 0; j < m; j++)if (g[i][j] == '@')st.x = i, st.y = j, st.step = 0, st.state = 0;}printf("%d\n", bfs());}return 0;
}
HDU 1429 bfs 状态压缩相关推荐
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- csu 1536 Bit String Reordering(模拟 bfs+状态压缩)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...
- BFS + 状态压缩总结
BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...
- nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】
题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...
- hdu 1429 胜利大逃亡(续) bfs+状态压缩
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- poj 1324(BFS+状态压缩)
解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...
- 2021-08-06 leetcode每日一题 BFS+状态压缩,无向图的
访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号. 给你一个数组 graph 表示这个图.其中,graph[i] 是一个列表,由所有与节点 i ...
- hdu 3006(状态压缩)
题意:给一些集合,取一部分集合合并能够得到多少个新集合. 解题思路:这道题数字最多只有14,可以用状态压缩去做,每一位代表某个数,0代表不取,1代表取这个数.剩下的就是去模拟状态了.不多讲,输入状态压 ...
- hdu 5418(状态压缩dp+Floyd)
点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...
- HDU1429胜利大逃亡(续)HDU 1885 Key Task BFS+状态压缩+水
HDU1429 只有10把钥匙 1<<10足够了 标记用三维数组 用Linux好不习惯 继续克服- #include <stdio.h> #include <string ...
最新文章
- 这些 Shell 分析服务器日志命令集锦,收藏好
- IBM Watson将成为失败的投资?分析师眼里, IBM AI过度乐观, 夸大宣传
- DHTML【2】--HTML
- Flex 中的 RSL
- iphone开发中的一些小技
- 计算机无法检测电池损耗怎么办,笔记本电脑无法充电怎么办?笔记本电池损耗如何修复?...
- JS 中判断一个对象是否为数组对象?
- 微型计算机的使用寿命,微型计算机使用注意事项及保养的一般方法
- 前端实现3d效果_前端动画效果实现的简单比较
- springcloud工作笔记100---@PostConstruct注解的作用
- 【Vue】—异步组件
- 单片机重要组成部分还有什么,引脚封装分布知识讲解(一)
- 上网行为管理网络分析系统
- 虚拟机网卡和linux bridge上tap设备的关系
- 如何交叉编译fio并移植到ARM、IOT上
- 调侃计算机专业的笑话,段子手要失业了 计算机也懂幽默
- Et aliquam sunt quasi harum unde.Deserunt impediSofort wohnen früh aus t quidem vel dolorum ducimus.
- office 2019 安装教程(图解版)
- 历届试题 合根植物 C语言,植物营养历年真题(整理).doc
- c语言零基础入门(完整版)
热门文章
- oracle卸载ogg,Oracle GoldenGate(ogg)安装经验大汇总,采坑总结,绝对干货!
- 【51单片机】 蜂鸣器发声程序
- 量子计算机的算力是多少,量子计算机算力有多强?可能是无数平行宇宙中的计算机在同时计算...
- ueditor 图片水印 php,[UEditor]上传图片自动添加水印
- MFC模态对话框和非模态对话框使用
- 二进制计算机课教案,《二进制与计算机》教学设计
- linux鼠标手势软件,linux 系统中全能的鼠标手势——easystroke
- 这一年很幸运,平平淡淡的|2021 年度总结
- ckeditor java 取值_Jquery 对Ckeditor 取值
- python计算三角形斜边上的中线_直角三角形斜边上的中线的性质及其应用