uva 1601 The Morning after Halloween code2

2023-11-06

题目:The Morning after Halloween


题意:有n个用小写字母表示的鬼和一张地图,每个鬼都要移动到对应的大写字母两个鬼的位置不能在一次移动中交换,问最少步数。


思路:

双向bfs。此题还可以单向bfs,见code1

1、先将地图用图的方法表示,即在每一个空白(包括大小写字母)和四周的空白连上一条边,用单个整数表示一个空白。

2、双向bfs。即从开始和结束都进行bfs,相遇时把两次的走过的路径长加起来就是结果。


参考:

http://blog.csdn.net/qq_29169749/article/details/51420097

http://blog.csdn.net/crazysillynerd/article/details/42681579


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
#include<queue>
using namespace std;

#define N 20
#define Num 3
#define m_step 200

int n,m,num;
int Start[Num],End[Num];
vector<int> g[N*N];
int cnt=0;
int step[m_step][m_step][m_step];
int color[m_step][m_step][m_step];

struct Node {
	int x[Num];
	Node() {}
	Node(int xx[]) {
		for(int i=0; i<num; i++) x[i]=xx[i];
	}
	Node(int one,int two,int three) {
		x[0]=one,x[1]=two,x[2]=three;
	}
	bool operator ==(const Node& other) const {
		for(int i=0; i<num; i++) {
			if(x[i]!=other.x[i]) return false;
		}
		return true;
	}
};

void init() {
	cnt=0;
	for(int i=0; i<N*N; i++) g[i].clear(),g[i].push_back(i);
	memset(step,-1,sizeof(step));
	memset(Start,0,sizeof(Start));
	memset(End,0,sizeof(End));
	memset(color,0,sizeof(color));
}

void make_G(char a[N][N]) {
	int fill[N][N]= {0};
	memset(fill,0,sizeof(fill));
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++) {
			if(a[i][j]!='#') {
				fill[i][j]=++cnt;
				if(i!=0&&a[i-1][j]!='#') g[cnt].push_back(fill[i-1][j]),g[fill[i-1][j]].push_back(cnt);
				if(j!=0&&a[i][j-1]!='#') g[cnt].push_back(fill[i][j-1]),g[fill[i][j-1]].push_back(cnt);
			}
		}
	}
	int S[26]= {0},E[26]= {0};
	memset(S,0,sizeof(S));
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++) {
			if('A'<=a[i][j]&&a[i][j]<='Z') {
				E[a[i][j]-'A']=fill[i][j];
			}
			if('a'<=a[i][j]&&a[i][j]<='z') {
				S[a[i][j]-'a']=fill[i][j];
			}
		}
	}
	int s=-1;
	for(int i=0; i<26; i++) {
		if(S[i]) {
			++s;
			Start[s]=S[i];
			End[s]=E[i];
		}
	}
}

void dbfs() {
	Node IN=Node(Start),OUT=Node(End);
	queue<Node> quef,queb;
	quef.push(IN),queb.push(OUT);
	step[IN.x[0]][IN.x[1]][IN.x[2]]=0;
	step[OUT.x[0]][OUT.x[1]][OUT.x[2]]=0;
	while(!quef.empty()&&!queb.empty()) {

		int T=quef.size();
		while(T--) {
			Node head=quef.front();
			quef.pop();
			int a=head.x[0],b=head.x[1],c=head.x[2];
			for(int i=0; i<g[a].size(); i++) {
				for(int j=0; j<g[b].size(); j++) {
					if(g[a][i]==g[b][j]||(a==g[b][j]&&b==g[a][i])) continue;
					for(int k=0; k<g[c].size(); k++) {
						int a2=g[a][i],b2=g[b][j],c2=g[c][k];
						if((a2==c2||c2==b2||(a==c2&&c==a2)||(b==c2&&c==b2))&&c!=0) continue;
						if(color[a2][b2][c2]==0) {
							step[a2][b2][c2]=step[a][b][c]+1;
							color[a2][b2][c2]=1;
							quef.push(Node(a2,b2,c2));
						} else if(color[a2][b2][c2]==2) {
							printf("%d\n",step[a2][b2][c2]+step[a][b][c]-1);
							return;
						}
					}
				}
			}
		}

		T=queb.size();	//注意在此处更新 
		while(T--) {
			Node head=queb.front();
			queb.pop();
			int a=head.x[0],b=head.x[1],c=head.x[2];
			for(int i=0; i<g[a].size(); i++) {
				for(int j=0; j<g[b].size(); j++) {
					if(g[a][i]==g[b][j]||(a==g[b][j]&&b==g[a][i])) continue;
					for(int k=0; k<g[c].size(); k++) {
						int a2=g[a][i],b2=g[b][j],c2=g[c][k];
						if((a2==c2||c2==b2||(a==c2&&c==a2)||(b==c2&&c==b2))&&c!=0) continue;
						if(color[a2][b2][c2]==0) {
							step[a2][b2][c2]=step[a][b][c]+1;
							color[a2][b2][c2]=2;
							queb.push(Node(a2,b2,c2));
						} else if(color[a2][b2][c2]==1) {
							printf("%d\n",step[a2][b2][c2]+step[a][b][c]-1);
							return;
						}
					}
				}
			}
		}

	}
}

int main() {
	while(scanf("%d%d%d",&m,&n,&num)==3&&n&&m&&num) {
		init();
		char a[N][N];
		for(int i=0; i<n; i++) {
			getchar();
			fgets(a[i],m+1,stdin);
		}
		make_G(a);
		dbfs();
	}
	return 0;
}


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

uva 1601 The Morning after Halloween code2 的相关文章

  • UVa1347 Tour

    题目描述 这道题我想了很久都没有想到 看了lrj的题解才会做 首先可以想到转化成两个人向右走 关键在于状态的设计 设 f i j f i j 为走完了前 max i j max i j 的点 且两个人分别在i j的位置 且 i gt j i
  • 图的创建和遍历

    图的定义 由顶点的有穷非空集合和顶点之间边的集合组成的数据类型 图的表示 G V E G表示一个图 V是图G的顶点集合 E为图G的边的集合 图的逻辑结构 多对多 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重表 图的一些无聊术语 顶点i
  • 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树 提示 本节仍然是重点说二叉树的DP递归套路 非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些 可以帮助你快速掌握树形DP的题目解题思想 就一个套路 1 判断二叉树是否为平衡二叉树 树形DP 树
  • hdu1253 胜利大逃亡(三维bfs索搜)

    http acm hdu edu cn showproblem php pid 1253 第一次做做三维的 思路跟二维的没有区别 这道题目第一次出现Memory Limit Exceeded 这种问题 找了很长时间才发现应该是先判断在存入
  • uva 1601 The Morning after Halloween

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 bfs 1 先将地图用图的方法表示 即在每一个空白
  • UVA-127 纸牌游戏 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 简单的模拟题目 暴力即可 我使用了栈记录每个堆的数量 include
  • 图的遍历方法——DFS和BFS

    DFS类似于树的先序遍历 因此可以用递归实现 BFS类似于树的层次遍历 因此可以用队列实现 说明 下面代码中图的存储方式是邻接表 关于邻接表和邻接矩阵可看邻接表和邻接矩阵 1 深度优先遍历 Depth First Search 思想 从图中
  • Oil Deposits(BFS)

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits GeoSurvComp works with one
  • linux--shell错误:syntax error near unexpected token ‘('

    这几天编写了几个简单的shell程序 然后都出现了syntax error near unexpected token 的错误 然后实在是检查不出错误 后面百度了才找到的原因 之前错误的程序片段如下 usr whoami dr pwd 提示
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • 境界的彼方_lduoj_bfs宽搜

    Description wyy是一个著名动画 境界的彼方 的男主 此时他非常的慌张 因为女主栗山未来进入了境界的彼方内部 并且花费了大量的血量去拯救wyy wyy此时也进入了境界的彼方 他妈给了他一张地图去寻找境界的彼方的核心去拯救女主 现
  • 迪杰斯特拉(Dijkstra)算法 Java实现(最短路径)

    基本思想 通过Dijkstra计算图G中的最短路径时 需要指定起点vs 即从顶点vs开始计算 此外 引进两个集合S和U S的作用是记录已求出最短路径的顶点 而U则是记录还未求出最短路径的顶点 以及该顶点到起点vs的距离 初始时 S中只有起点
  • UVa10881题解报告

    题目 L长的棍子上有n个蚂蚁 他们分别向左或右爬 速度为1 求T时间后各蚂蚁的状态 题解 白书给出了一个很巧妙的解法 将蚂蚁看作质点 相撞掉头等于对穿而过 因为掉头所以 他们最后的顺序与输入时在棍子上的顺序相同 所以只要记录下初始状态下蚂蚁
  • 图的邻接矩阵存储

    public class Graph init public static int MAX GRAPH SIZE 256 最大顶点个数 public static int MAX WEIGHT 65536 图中最大权值 public int
  • 克鲁斯卡尔算法(kruskal)

    我自己感觉 克鲁斯卡尔算法比普利姆算法更好理解 它就两个要点 排序和判断是否成环 排序 我们把两两相邻的边根据边的权值 从小到大依次排序 这个十大排序算法可以自己选一个去实现下 刚好还可以回忆下以前的算法 下面我们使用冒泡来实现边的排序 是
  • 【算法学习笔记】19:拓扑排序

    1 简述 计算拓扑序列的一个方式是 用BFS来尝试访问所有的节点 但是有一个约束就是只有入度为 0 0 0的节点才能被加入到扩展队列里 每次从队列里取出一个节点 也就同时在图中将这个节点拆除 所以它的所有后继的节点都减少 1 1 1 如果已
  • Leetcode【DFS BFS】

    Leetcode 200 岛屿数量 题目 解题 思路 DFS解法 BFS解法 题目 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 方板围棋吃子换001

    1 描述 130给定一个二维的矩阵 包含 X 和 O 字母 O 找到所有被 X 围绕的区域 并将这些区域里所有的 O 用 X 填充 示例 X X X X X O O X X X O X X O X X 运行你的函数后 矩阵变为 X X X
  • UVA 1347 Tour

    描述 Click Here quad 给定平面上n n lt 1000 个点的坐标 按照x递增的顺序给出 各点x坐标不同 且均为整数 你的任务是设计一条路线 从最左边的点出发走到最右边的点再返回 要求除了最左边和最右边之外 每个点恰好经过一

随机推荐

  • Pycharm绘图时显示额外的“figure”浮窗

    如图所示 不想图片显示在右边 而是单独的一个窗口 这样可以进行点击交互 1 File gt Settings gt 2 找到Tools gt Python Scientific 找到 Python Scientific 去除右边候选框中的勾
  • SpringCache使用

    SpringCache使用 1 引入依赖 引入springcache依赖
  • three.js坐标轴辅助器AxesHelper

    一 效果图 二 添加坐标轴辅助器 使用three js 通过以下代码可以添加坐标轴辅助器 创建坐标轴辅助器 var axesHelper new THREE AxesHelper 5 添加到场景中 scene add axesHelper
  • 私有云平台管理

    更改主机名 controller hostnamectl set hostname controller compute hostnamectl set hostname compute 更改hosts文件 vi etc hosts 插入以
  • Java NIO通信编程

    NIO即非同步非阻塞式IO 有如下几个特点 1 创建一个线程负责处理IO事件和IO事件的分发 2 事件驱动机制 事件到达之后触发 3 线程之间通过wait notify等方式通信 减少线程间切换 NIO客户端和服务端需都维护一个管理通道的对
  • flutter加载不同分辨率本地图片

    flutter移动开发怎么加载本地图片 首先在该项目根目录也就是和ios android同级创建一个images文件夹用来存放图片资源 然后放入需要加载的图片资源例如ic phone png 然后在项目目录下找到pubspec yaml文件
  • 【定量分析、量化金融与统计学】统计推断基础 番外(1)---T table与Z table的值

    目录 一 前言 二 T table 三 Z table 一 前言 为了方便之后的例题讲解 这里放上T tabel和Z table的值 怎么查表 本篇中会直接讲 所以这里就只看表格就行 本篇为工具篇 二 T table 我们给两个版本 适合用
  • Redis学习笔记:数据结构和命令

    本文是自己的学习笔记 主要参考资料如下 马士兵 4 Redis的五大数据类型 1 1 String 1 1 1 String 类型的命令 1 1 2 存储对象 1 2 List 1 2 1 List基本命令 1 2 2 List高级命令 1
  • linux 提高文件读写速度 mmap,【EA字符串Linux面试题】面试问题:kafka读写… - 看准网...

    传统IO 缓存IO 传统IO也就是缓存IO 数据先从磁盘复制到内核空间缓冲区 然后从内核空间缓冲区复制到应用程序的地址空间 这里的内核缓冲区也就是页缓存 PageCache 是虚拟内存空间 读操作 操作系统检查内核的缓冲区有没有需要的数据
  • QT结构体中定义QString注意点

    当需要进行多进程通讯时 结构体中出现字符串时尽量采用C 标准类型 尽量少用QT特有类型QString字符串 尽量采用char 类型替代 这样在多进程通讯时 可直接通过memcpy直接复制内存的方式 而不用担心内存异常问题 由于QString
  • 动手搭建第一个小程序音视频Demo

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 小程序音视频产品经理 腾讯云提供了全套技术文档和源码来帮助您快速构建一个音视频小程序 但是再好的源码和文档也有学习成本 为了尽快的能调试起来 我们还提供了一个免费的一键部署服务 您
  • 华为OD机试 - 最长连续子序列(Java )

    题目描述 有N个正整数组成的一个序列 给定整数sum 求长度最长的连续子序列 使他们的和等于sum 返回此子序列的长度 如果没有满足要求的序列 返回 1 输入描述 第一行输入是 N个正整数组成的一个序列 第二行输入是 给定整数sum 输出描
  • 02 电阻容模型的创建

    打开状态栏 画电阻 电容的封装 实操要点 1 SCH Library一定要先选中 出现元件库的列表 2 放置完元件可以按ESC取消 3 Ctrl C V可以复制粘贴用 4 多余的线可以使用Delete删除 5 可以按鼠标右键轻微的拖动屏幕
  • ViLT:最简单的多模态Transformer

    原文链接 感谢原作者 ViLT 最简单的多模态Transformer 陀飞轮 复
  • 两台外网计算机远程桌面访问(内网穿透)

    背景 如图所示 项目中需要远程访问项目现场的外网计算机 通过外网计算机再访问到现场内网环境中的另外一台计算机 原计划通过市面上的远程桌面软件 如向日葵 ToDesk AnyDesk等 建立两台外网计算机的远程连接 在使用windows自带的
  • UmiJS介绍--mock(四)

    umi 里约定 mock 文件夹下的文件即 mock 文件 文件导出接口定义 支持基于 require 动态分析的实时刷新 支持 ES6 语法 以及友好的出错提示 1 引入 Mock js Mock js是常用的辅助生成模拟数据的第三方库
  • 编写过滤器jar包并植入到项目中

    公司有项目有个需求 就是希望可以写一个统一的权限管理 每次开发新项目的时候 可以通过添加依赖包进行权限的获取 验证 至于为什么不使用aop 拦截器二使用过滤器 是因为在java中 如果3者同事存在 最先执行的是过滤器 一 新建第三方过滤器j
  • QT 使用 qtasome图标 (python版)

    首先安装 qtawesome 库 然后到图标库找到需要的图标 图标名称为 fa xxx 图标库链接 http www fontawesome com cn faicons 在 retranslateUi 模块中 对相应 按钮 进行操作 运行
  • 6_机器翻译与Seq2Seq模型

    文章目录 一 Sequence to Sequence Model Seq2Seq 1 1 Machine Translation Data 机器翻译数据 1 2 Tokenization Build Dictionary 分词和建造字典
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1