UVA 1601 The Morning after Halloween

2023-11-05

https://vjudge.net/problem/UVA-1601

题目

你在游乐场的鬼屋里当操作员,专门控制鬼屋里的机器人……某日没事干的出题人把这些机器人搬到了其他地方,你需要在最短的时间内遥控机器人让他们回到原位。所有机器人都可以同时在1秒内朝四个方向(上下左右)移动1格,但是每次移动都必须符合以下条件

  1. 每个格子只能有一个机器人
  2. 任意两个机器人的位置不能交换
  3. 不能移动到墙里……

问你需要至少多少时间才能把所有机器人归位。

输入包含多组数据

地图的宽、高和机器人的数量

下面几行表示地图,其中小写字母表示机器人的位置,大写字母表示机器人的终点,'#'表示墙,' '表示可以走的位置……

输出每组数据下的最短时间

样例输入

5 5 2
#####
#A#B#
#   #
#b#a#
#####
16 4 3
################
## ########## ##
#    ABCcba    #
################
16 16 3
################
### ##    #   ##
##  #  ##   # c#
#  ## ########b#
# ##  # #   #  #
#   # ##  # # ##
## a# #   # #  #
### ## #### ## #
##   #   #  #  #
#  ##### # ## ##
####   #B# #   #
##  C#   #   ###
#  # # ####### #
# ######  A##  #
#        #    ##
################
0 0 0

 样例输出

7
36
77

 题解

只用了一个单向bfs,对空格编号建图,用前向星……

检测能否互换需要分n=2和n=3两种情况考虑

n=2时很简单

n=3时要考虑$\binom{3}{2}$种情况,头晕还多想了3个位置都换了的情况,其实这是不可能的,由于只能移动一步,所以加上这个这只是浪费时间……

AC代码(1080ms,去掉浪费时间的部分是750ms)

#include<bits/stdc++.h>
using namespace std;
#define REP(i,x,y) for(register int i=(x); i<(y); i++)
#define REPE(i,x,y) for(register int i=(x); i<=(y); i++)
#ifdef sahdsg
#define DBG(a,...) printf(a, ##__VA_ARGS__)
#else
#define DBG(a,...) (void)0
#endif

#define MAXN 20
#define MAXP 300
int w,h,n;
int cnt;
int mp[MAXN][MAXN];
int st[3],ed[3];
bool vis[MAXP][MAXP][MAXP];
int hed[131072], nxt[131072], poi[131072], fstar=0;
inline void conn(int f, int t) {
	nxt[fstar]=hed[f];
	poi[fstar]=t;
	hed[f]=fstar++;
}
struct node {
	int s;
	int p[3];
	node(int *x, int y=0):s(y) {memcpy(p,x,sizeof p);}
};
inline void bfs() {
	memset(vis,0,sizeof vis);
	queue<node> q;
	q.push(node(st));
	int ans=-1;
	while(!q.empty()) {
		node now = q.front();q.pop();
		if(memcmp(now.p,ed,sizeof ed)==0) {ans=now.s; break;}
		int i[3],k[3],dis[3];
		REP(i,0,n) dis[i]=now.p[i];
		memset(k,0,sizeof k);
		#define CHK k[0]!=k[1] && k[1]!=k[2] && k[2]!=k[0]
		for(i[0]=hed[now.p[0]]; ~i[0]; i[0]=nxt[i[0]]) {
			k[0]=poi[i[0]];
			if(n>=2) for(i[1]=hed[now.p[1]]; ~i[1]; i[1]=nxt[i[1]]) {
				k[1]=poi[i[1]];
				if(n>=3) for(i[2]=hed[now.p[2]]; ~i[2]; i[2]=nxt[i[2]]){
					k[2]=poi[i[2]];
					if(!vis[k[0]][k[1]][k[2]]) if(CHK) {
						if(dis[0]==k[1] && dis[1]==k[0]) continue;
						if(dis[0]==k[2] && dis[2]==k[0]) continue;
						if(dis[1]==k[2] && dis[2]==k[1]) continue;
						
						int j[3],l[3];
						memcpy(j,k,sizeof j);memcpy(l,dis,sizeof j);
						sort(j,j+3);sort(l,l+3);
						if(memcmp(j,l,sizeof j)==0) continue;
						vis[k[0]][k[1]][k[2]]=1;
						q.push(node(k,now.s+1));
					}
				}
				else if(!vis[k[0]][k[1]][0]) if(k[0]!=k[1]) {
					if(k[0]==dis[1] && k[1]==dis[0]) continue;
					vis[k[0]][k[1]][0]=1; q.push(node(k,now.s+1));
				}
			} else if(!vis[k[0]][0][0]){vis[k[0]][0][0]=1; q.push(node(k,now.s+1));}
		}
	}
	printf("%d\n", ans);
}
int main() {
	#ifdef sahdsg
	freopen("in.txt", "r", stdin);
	#endif
	while(~scanf("%d%d%d", &w, &h, &n) && w) {
		cnt=0;
		memset(hed,-1,sizeof hed);
		memset(st,0,sizeof st);
		memset(ed,0,sizeof ed);
		fstar=0;
		REP(i,0,h) REP(j,0,w) {
			char ch = getchar();
			if(ch<' ')ch=getchar();
			if(ch=='#') {mp[i][j]=-1; continue;}
			mp[i][j]=cnt;
			if(ch>='a' && ch<='z') st[ch-'a']=cnt;
			else if(ch>='A' && ch<='Z') ed[ch-'A']=cnt;
			conn(cnt,cnt);
			if(i>0 && mp[i-1][j]>=0) conn(mp[i-1][j],cnt),conn(cnt,mp[i-1][j]);
			if(j>0 && mp[i][j-1]>=0) conn(mp[i][j-1],cnt),conn(cnt,mp[i][j-1]);
			cnt++;
		}
		bfs();
	}
	
	return 0;
}

 比较慢,可以用双向bfs或A*优化……

转载于:https://www.cnblogs.com/sahdsg/p/10443116.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UVA 1601 The Morning after Halloween 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • SaltStack 自动化运维详解

    一 自动化运维工具对比 使用所需软件配置单个服务器是一项相当简单的任务 但是 如果许多服务器需要安装相同或相似的软件和配置 则该过程将需要大量的工时才能完成 这会耗尽您本已紧张的资源 如果没有某种形式的自动化 这项任务几乎无法完成 考虑到这
  • 关于SpringMVC返回date的格式问题

    Spring 项目中 java的util date和java time类型的日期 返回到前端的时候 默认的序列化方式显示的是标准格式 为了能够正确的显示想要的时间 可以使用jackson指定时间的格式 访问我的个人网站获取更多文章 数据库的
  • 汽车的操作系统AUTOSAR

    汽车软件开发autosar 01汽车相关知识 汽车发展三大趋势 电动化 智能化 网联化 1 电动化 底层支撑 网联化的驱动力 2 智能化 人工智能借助软硬融合带来功能升级 体验升级 安全升级 3 网联化 5G的应用场景 让汽车与人 车 物的
  • golang实现p2p之UDP打洞

    当今互联网到处存在着一些中间件 MIddleBoxes 如NAT和防火墙 导致两个 不在同一内网 中的客户端无法直接通信 这些问题即便是到了IPV6时代也会存在 因为即使不需要NAT 但还有其他中间件如防火墙阻挡了链接的建立 目前部署的中间
  • spring boot毕业生跟踪调查管理系统 毕业设计源码论文+答辩PPT

    答辩PPT 论文 springboot毕业生跟踪调查管理系统 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对
  • CF 1843F2 - Omsk Metro (hard version)

    CF 1843F2 Omsk Metro hard version 题目描述 给定 n n n 个节点的有根树 根节点为 1 1 1 每个节点上有权值 0
  • asp.net中,<%#%>,<%=%>和<%%>分别是什么意思,有什么区别

    在asp net中经常出现包含这种形式的html代码 总的来说包含下面这样几种格式 一 这种格式实际上就是和asp的用法一样的 只是asp中里面是vbscript或者javascript代码 而在asp net中是 net平台下支持的语言
  • 使用ScriptableObject代替部分配置表的坑点

    1 使用ScriptableObject代替部分配置表的坑点 2 加载配置内存过大问题 3 URP的UI在Android模型器下比在真机上暗 4 Unity在Windows上第一次运行Play启动很慢 5 如何正确卸载UnityWebReq
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 【2023】数据库sql增删改查执行命令汇总(配合详细举例)

    一 单表查询 数据查询语言 专门用于查找表中的数据 select from emp 关键字 select from 表名 查询表中的所有数据 source 导入文件的文件地址 文件名称 导入dump数据 结尾不能加 号 mysql的数据备份
  • 【git】全局配置和单个仓库的用户名邮箱配置

    Git全局配置和单个仓库的用户名邮箱配置 学习git的时候 大家刚开始使用之前都配置了一个全局的用户名和邮箱 git config global user name github s Name git config global user
  • 领导力大挑战

    author skate time 2012 10 13 在实施Scrum的项目中 Scrum Master对于团队而言是相当关键的 担当着推动整个团队完成产品所有者既定目标的角色 Scrum Master的主要工作是替团队扫清前进的障碍
  • 树莓派交叉编译如何处理软连接

    软链接有点类似windows的快捷方式 添加软连接 ln s libfilename so 2 5 libfilenameso ln是指令 s是参数 so 2 5是要被链接的文件 so是软连接名字 生成硬链接 去掉 s
  • STM32编译错误

    output test axf Error L6218E Undefined symbol SystemInit referred from startup stm32f10x hd o Not enough information to
  • 现代计算机从0到1:冯·诺依曼计算机

    最近打算开始写博客 在想一开始该写什么好呢 突然灵光一现 关于计算机当然就是现代计算机之父 我们今天就来聊一下现代计算机之父 约翰 冯 诺依曼 John Von Nouma 1903 1957 美藉匈牙利人 1903年12月28日生于匈牙利
  • Linux驱动开发 通过字符设备驱动分步注册方式编写LED驱动

    通过字符设备驱动分步注册方式编写LED驱动 完成设备文件和设备的绑定 head h ifndef HEAD H define HEAD H typedef struct unsigned int MODER unsigned int OTY
  • STM32实战总结:HAL之IAP

    我们学习单片机一般都是从51开始的 51单片机烧录程序通常是使用烧录软件如STC ISP 这种方式 通过串口连接单片机 选择一个合适的波特率就可以烧录了 后来学习STM32 编程时使用KEIL软件自带的下载按钮就能下载程序 方便了不少 但需
  • ssh 连接到docker内,环境变量发生变化的解决方法(改)

    参考 https blog csdn net m0 59029800 article details 125479518 上述方法的问题 环境变量中存在空格时出错 解决方法 更改字段分隔符 使之仅仅遇到换行时分割 OLD IFS IFS n
  • 19、ddt数据驱动测试

    背景 设计测试用例是 有些测试用例只是参数数据输入不一样而已 比如登录时 需要经常切换账号 而操作基本是一样的 如果用例重复去写操作过程会导致很多冗余的代码 1 安装ddt pip install ddt 2 原理 测试数据为多个字典的li
  • UVA 1601 The Morning after Halloween

    https vjudge net problem UVA 1601 题目 你在游乐场的鬼屋里当操作员 专门控制鬼屋里的机器人 某日没事干的出题人把这些机器人搬到了其他地方 你需要在最短的时间内遥控机器人让他们回到原位 所有机器人都可以同时在