题目链接

题目

题目描述

今天是阳光明媚,晴空万里的一天,CSL早早就高兴地起床走出寝室到校园里转悠。

但是,等到他回来的时候,发现他的校园卡不见了,于是他需要走遍校园寻找它的校园卡。CSL想要尽快地找回他掉的校园卡,于是便求助于OneDay帮他一起找。

OneDay和CSL在同一已知的地点出发,并以相同的速度(1格/秒)搜索校园,试求两人走遍校园的最短时间。

输入描述

第一行为两个整数n,m(1 ≤ n, m ≤ 4),表示地图的大小。接下来是n行m列的地图:X表示障碍物,S表示起点,O表示空地。障碍物不能直接经过,数据保证所有空地是可达的,起点有且只有一个。

输出描述

输出一个整数表示两人共同走遍校园所需的最少时间。

示例1

输入

  1. 3 4
  2. XSOO
  3. OOXO
  4. OOOO

输出

  1. 5

说明

示例2

输入

  1. 2 3
  2. XSX
  3. OOO

输出

  1. 2

示例3

输入

  1. 4 4
  2. SOOO
  3. OOOO
  4. OOOO
  5. OOOO

输出

  1. 8

题解

知识点:BFS。

和通常走迷宫状态是坐标不同,这次是具体的两人坐标加上抽象的局面状态一共五维,每维都是互相独立的。

将局面状态压缩成一个整数,先将二维坐标压缩成一维 \(i*n+j\) ,再将这个坐标压缩进状态 \(1<<(i*n+j)\) ,于是实现了状态压缩。

每次扩展都是把两人 \(16\) 种方向组合都枚举一遍。

直到当前局面和目标局面相等则输出步数。

时间复杂度 \(O(?)\)

空间复杂度 \(O(m^2n^22^{mn})\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m;
  4. char dt[4][4];
  5. const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
  6. int fin;
  7. bool vis[4][4][4][4][1 << 16];
  8. struct node {
  9. int x1, y1, x2, y2, state, step;
  10. };
  11. int bfs(node st) {
  12. queue<node> q;
  13. q.push(st);
  14. vis[st.x1][st.y1][st.x2][st.y2][st.state] = 1;
  15. while (!q.empty()) {
  16. node cur = q.front();
  17. q.pop();
  18. if (cur.state == fin) return cur.step;
  19. for (int i = 0;i < 4;i++) {
  20. for (int j = 0;j < 4;j++) {
  21. int xx1 = cur.x1 + dir[i][0];
  22. int yy1 = cur.y1 + dir[i][1];
  23. int xx2 = cur.x2 + dir[j][0];
  24. int yy2 = cur.y2 + dir[j][1];
  25. int sstate = cur.state | (1 << (xx1 * 4 + yy1)) | (1 << (xx2 * 4 + yy2));
  26. if (xx1 < 0 || xx1 >= n || yy1 < 0 || yy1 >= m) continue;
  27. if (xx2 < 0 || xx2 >= n || yy2 < 0 || yy2 >= m) continue;
  28. if (dt[xx1][yy1] == 'X' || dt[xx2][yy2] == 'X') continue;
  29. if (vis[xx1][yy1][xx2][yy2][sstate]) continue;
  30. vis[xx1][yy1][xx2][yy2][sstate] = 1;
  31. q.push({ xx1,yy1,xx2,yy2,sstate,cur.step + 1 });
  32. }
  33. }
  34. }
  35. return -1;
  36. }
  37. int main() {
  38. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  39. cin >> n >> m;
  40. node st;
  41. for (int i = 0;i < n;i++) {
  42. for (int j = 0;j < m;j++) {
  43. cin >> dt[i][j];
  44. if (dt[i][j] == 'S') st = { i,j,i,j,1 << (i * 4 + j),0 };
  45. if (dt[i][j] != 'X') fin |= 1 << (i * 4 + j);
  46. }
  47. }
  48. cout << bfs(st) << '\n';
  49. return 0;
  50. }

NC17872 CSL的校园卡的更多相关文章

  1. 牛客小白月赛7 CSL的校园卡

    CSL的校园卡 思路: bfs,用状压表示走过的区域,然后和x1,y1,x2,y2构成所有的状态,然后标记一下就可以了 代码: #pragma GCC optimize(2) #pragma GCC ...

  2. [比赛|考试]nowcoder 小白月赛7

    牛客小白月赛7 比赛地址.本次比赛我切了8道(ACM赛制),rank(20). 反思:刚入手ACM赛,光追求刺激了,没有总结ACM赛制的经验.是应该多提交>..还是少提交...小白赛还有两道不会 ...

  3. ID卡和IC卡

    1.ID卡 ID卡就是一种身份识别卡,卡内除了卡号之外,无任何加密功能. ID卡的工作原理:它是由卡.读卡器.后台控制器组成的. (1)读卡器通过天线发射射频信号 (2)当卡进入信号范围内后卡被激活 ...

  4. 破解简单Mifare射频卡密钥杂记

    先要了解一点大学城浴卡用的是什么卡,经查证是Mifare S50卡,也有叫ISO14443A的(协议名).本来想看看大学城浴卡有没有安全漏洞,没想到浴卡公司在安全性上几乎是蔑视我们大学生的智商,虽然被 ...

  5. IC卡

    本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card).智慧卡(Intelligent ...

  6. .Net小白离开校园的第一年

    Why? 2018的已经步入尾声,对新的一年又是充满期待. 在这年底里,看到园子里有很多园友写了博客回顾自己的2018,本人自知文笔和各位前辈比不了,但是我也想来写一写,这是我特殊的第一年,记录下来, ...

  7. “今日校园” App 用户体验分析

    一.背景 为进一步提升信息化应用水平,更好的服务师生,南通大学智慧校园移动端APP“今日校园”定于11月5日正式上线运行.登陆APP可浏览学校新闻.校园生活.各部门微信公众号等内容,查看校内通知.校内 ...

  8. 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》

    我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...

  9. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  10. C#:根据银行卡卡号判断银行名称

    原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,博主是一个今年刚出来的应届毕业生,不足之处请多多包涵. 根据银行卡号判断所属银行,依 ...

随机推荐

  1. python3使用diagrams生成架构图

    技术背景 对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能.这就像我们学习的时候整理的一些Xmind那种思维逻辑图一样,不仅可以帮我们看到组件之间的联系和层级,还能够展示 ...

  2. 2023年度总结,互联网寒冬是躺平OR寻找风口

    一.前言 又到了年底,这一年过的真的好快,犹如白驹过隙. 身体快跃过去了,灵魂还没有. 拿起键盘却迟迟无法下手,经过三天终于完成了! 这是很颓很丧的一年,很难看到自己的成长,就像登山卡在半山腰,开车堵 ...

  3. 【MicroPython】用 c 添加接口 -- 给 module 添加 function

    [来源]https://www.eemaker.com/micropython-c-modfunc.html

  4. 0xGame 2023【WEEK2】Crypto全解

    中间的那个人 题目信息 from secret import flag from Crypto.Util.number import * from Crypto.Cipher import AES f ...

  5. [转帖]15--k8s之安全认证

    https://www.cnblogs.com/caodan01/p/15137987.html 目录 一.访问控制概述 二.认证管理 三.授权管理 虽然authorization-clusterro ...

  6. [转帖]07、kvm虚拟机的克隆

    操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...

  7. [转帖]在KingbaseES数据库中批量创建数据库/表

    1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,s ...

  8. [转帖]exportfs命令

    https://www.cnblogs.com/xzlive/p/9766388.html exportfs命令:功能说明 :NFS共享管理语法格式exportfs [必要参数][选择参数][目录]功 ...

  9. CentOS8 安装 SQLSERVER2019的简单过程

    1. 获取rpm包直接从微软官方网站即可 -rw-r--r-- 1 root root 820984 Apr 5 22:23 msodbcsql17-17.5.2.1-1.x86_64.rpm -rw ...

  10. Oracle 建立数据库dblink 然后同步部分表内容的总结

    同步处理部分数据 背景 最近在项目上发现两个分库进行数据同步时部分内容同步存在问题. 最简单的方法是导表,但是害怕有其他关联信息异常, 所以同事想到了dblink的方式. 这里简单整理一下 同事用到的 ...