NC17872 CSL的校园卡
题目
题目描述
今天是阳光明媚,晴空万里的一天,CSL早早就高兴地起床走出寝室到校园里转悠。
但是,等到他回来的时候,发现他的校园卡不见了,于是他需要走遍校园寻找它的校园卡。CSL想要尽快地找回他掉的校园卡,于是便求助于OneDay帮他一起找。
OneDay和CSL在同一已知的地点出发,并以相同的速度(1格/秒)搜索校园,试求两人走遍校园的最短时间。
输入描述
第一行为两个整数n,m(1 ≤ n, m ≤ 4),表示地图的大小。接下来是n行m列的地图:X表示障碍物,S表示起点,O表示空地。障碍物不能直接经过,数据保证所有空地是可达的,起点有且只有一个。
输出描述
输出一个整数表示两人共同走遍校园所需的最少时间。
示例1
输入
3 4
XSOO
OOXO
OOOO
输出
5
说明

示例2
输入
2 3
XSX
OOO
输出
2
示例3
输入
4 4
SOOO
OOOO
OOOO
OOOO
输出
8
题解
知识点:BFS。
和通常走迷宫状态是坐标不同,这次是具体的两人坐标加上抽象的局面状态一共五维,每维都是互相独立的。
将局面状态压缩成一个整数,先将二维坐标压缩成一维 \(i*n+j\) ,再将这个坐标压缩进状态 \(1<<(i*n+j)\) ,于是实现了状态压缩。
每次扩展都是把两人 \(16\) 种方向组合都枚举一遍。
直到当前局面和目标局面相等则输出步数。
时间复杂度 \(O(?)\)
空间复杂度 \(O(m^2n^22^{mn})\)
代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
char dt[4][4];
const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int fin;
bool vis[4][4][4][4][1 << 16];
struct node {
int x1, y1, x2, y2, state, step;
};
int bfs(node st) {
queue<node> q;
q.push(st);
vis[st.x1][st.y1][st.x2][st.y2][st.state] = 1;
while (!q.empty()) {
node cur = q.front();
q.pop();
if (cur.state == fin) return cur.step;
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
int xx1 = cur.x1 + dir[i][0];
int yy1 = cur.y1 + dir[i][1];
int xx2 = cur.x2 + dir[j][0];
int yy2 = cur.y2 + dir[j][1];
int sstate = cur.state | (1 << (xx1 * 4 + yy1)) | (1 << (xx2 * 4 + yy2));
if (xx1 < 0 || xx1 >= n || yy1 < 0 || yy1 >= m) continue;
if (xx2 < 0 || xx2 >= n || yy2 < 0 || yy2 >= m) continue;
if (dt[xx1][yy1] == 'X' || dt[xx2][yy2] == 'X') continue;
if (vis[xx1][yy1][xx2][yy2][sstate]) continue;
vis[xx1][yy1][xx2][yy2][sstate] = 1;
q.push({ xx1,yy1,xx2,yy2,sstate,cur.step + 1 });
}
}
}
return -1;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
node st;
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
cin >> dt[i][j];
if (dt[i][j] == 'S') st = { i,j,i,j,1 << (i * 4 + j),0 };
if (dt[i][j] != 'X') fin |= 1 << (i * 4 + j);
}
}
cout << bfs(st) << '\n';
return 0;
}
NC17872 CSL的校园卡的更多相关文章
- 牛客小白月赛7 CSL的校园卡
CSL的校园卡 思路: bfs,用状压表示走过的区域,然后和x1,y1,x2,y2构成所有的状态,然后标记一下就可以了 代码: #pragma GCC optimize(2) #pragma GCC ...
- [比赛|考试]nowcoder 小白月赛7
牛客小白月赛7 比赛地址.本次比赛我切了8道(ACM赛制),rank(20). 反思:刚入手ACM赛,光追求刺激了,没有总结ACM赛制的经验.是应该多提交>..还是少提交...小白赛还有两道不会 ...
- ID卡和IC卡
1.ID卡 ID卡就是一种身份识别卡,卡内除了卡号之外,无任何加密功能. ID卡的工作原理:它是由卡.读卡器.后台控制器组成的. (1)读卡器通过天线发射射频信号 (2)当卡进入信号范围内后卡被激活 ...
- 破解简单Mifare射频卡密钥杂记
先要了解一点大学城浴卡用的是什么卡,经查证是Mifare S50卡,也有叫ISO14443A的(协议名).本来想看看大学城浴卡有没有安全漏洞,没想到浴卡公司在安全性上几乎是蔑视我们大学生的智商,虽然被 ...
- IC卡
本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card).智慧卡(Intelligent ...
- .Net小白离开校园的第一年
Why? 2018的已经步入尾声,对新的一年又是充满期待. 在这年底里,看到园子里有很多园友写了博客回顾自己的2018,本人自知文笔和各位前辈比不了,但是我也想来写一写,这是我特殊的第一年,记录下来, ...
- “今日校园” App 用户体验分析
一.背景 为进一步提升信息化应用水平,更好的服务师生,南通大学智慧校园移动端APP“今日校园”定于11月5日正式上线运行.登陆APP可浏览学校新闻.校园生活.各部门微信公众号等内容,查看校内通知.校内 ...
- 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》
我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- C#:根据银行卡卡号判断银行名称
原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,博主是一个今年刚出来的应届毕业生,不足之处请多多包涵. 根据银行卡号判断所属银行,依 ...
随机推荐
- 运筹学 | 退化的最优解 vs 无穷多最优解?
退化的最优解: 单纯形表的基可行解中,出现等于零的基变量.或者,按最小比值来确定出基向量时,存在两个以上相同最小比值. 出现的原因:模型中存在多余的约束. 无穷多最优解: 单纯形表中,按最大检验数 σ ...
- idea开发常用快捷键总结
转载请注明出处: idea提供了很多的快捷键,但在开发过程中并发全用,只是常用部分快捷键,在这里总结一下,总结的不全,有好的快捷键可在评论里补充下,提前谢各位 由于很早之前用的eclipse或spri ...
- python3使用json、pickle和sqlite3持久化存储字典对象
技术背景 在各种python的项目中,我们时常要持久化的在系统中存储各式各样的python的数据结构,常用的比如字典等.尤其是在云服务类型中的python项目中,要持久化或者临时的在缓存中储存一些用户 ...
- [转帖]ORACLE恢复神器之ODU/AUL/DUL
https://www.cnblogs.com/oracle-dba/p/3873870.html 分享ORACLE数据库恢复神器之ODU.DUL和AUL工具. ODU:ORACLE DATABASE ...
- [转帖]SIMD指令集 SSE/AVX
SIMD指令集 SSE/AVX 概述 参考手册 Intel Intrinsics Guide Tommesani.com Docs Intel 64 and IA-32 Architectures S ...
- 【计数,DP】CF1081G Mergesort Strikes Back
Problem Link 现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达 \(k\) 则立即返回.其它部分都和正常归并排序一样,递归中点是 \(\lfloor (l+r)/2 ...
- node借助jsonwebtoken生成token以及验证token是否过期
生成token使用 jsonwebtoken 插件 我当时使用的版本"jsonwebtoken": "^9.0.0", cnpm i jsonwebtoken ...
- js数组修改后会互相影响
// 假设httpServe 是服务器返回来的数据 // 我们这里有一个需求, // 某一个区域需要对这一份数据进行展示 // 另一个区域需要只需要展示前1条数据 let httpServe = [ ...
- 【K哥爬虫普法】12亿公民信息泄露,仅判3年,个人信息是否为爬虫“禁区”?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 【JS 逆向百例】元素ID定位加密位置,某麻将数据逆向
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某在线麻将 ...