UVA-1601 万圣节后的早晨 题解答案代码 算法竞赛入门经典第二版
GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版
以三个点的当前位置作为状态,广度优先遍历,找到终点即为最短次数。
注意:
一次可以移动多个点,但是每个点只能移动一步。在同一次中,B可以移动到A离开前的位置上,即如果A走了,B可以去A之前的位置。因此,这三个点的移动和判断是有先后顺序的。对每个状态遍历时,情况实际上有 3的全排列(值为6),以及每个点移动的可能四种位置: 3! * 4^3。当然因为墙的存在,因此并没有这么多。
由于最高只有3,因此我的全排列写的不怎么优雅,直接嵌套循环完成了。注意每个点可以动,也可以不动,因此我们要考虑只有一个点动,两个点动的情况。写全排列时。如果第一个点动了大现已经遍历过,这时候不能放入队列(因为在其他点不动的情况下,这个状态已经遍历过了)。但是如果后面的点还继续动,那么这并不是一个完整的状态,因此不应该终止全排列。
按照上面的方法做的话,耗时很久,我扣了点细节,最后终于压线AC。(时间限制12000ms)

1. 根据题目描述,很多节点周围都是墙,因此用邻接表效率更高一些。
2. 一个点的坐标位置为1-16, x和y很容易放到一个数字中存储的。相对于每次计算x1 == x2 && y1 == y2, 一个数字的计算次数更少。其实三个结点的xy位置应该可以整合为一个数字的,这样效率会更高。
3. 我的答案中用到了struct,一些辅助的判断函数,使用引用而不是直接将整个对象值作为参数,性能会提高一些。
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>using namespace std;int graph[20][20];
vector<int> graphVec[300];
int w, h, n;struct Point {char ch;int pos;
};
Point initPoints[3];
Point suppPoints[3];struct Status {int pos[3];int step;
};
Status origin, terminal;bool access[300][300][300];int steps[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };bool sameLetter(char small, char big) {return small == big - 'A' + 'a';
}
bool statusEqual(Status &s1, Status &s2) {for (int i = 0; i < n; ++i) {if (s1.pos[i] != s2.pos[i]) return false;}return true;
}int xy2Num(int x, int y) {return x * 17 + y;
}void num2XY(int num, int *x, int *y) {*x = num / 17;*y = num % 17;
}bool judgeAcc(Status &s) {if (n == 1) return access[s.pos[0]][0][0];if (n == 2) return access[s.pos[0]][s.pos[1]][0];if (n == 3) return access[s.pos[0]][s.pos[1]][s.pos[2]];
}void setAcc(Status &s) {if (n == 1) access[s.pos[0]][0][0] = true;if (n == 2) access[s.pos[0]][s.pos[1]][0] = true;if (n == 3) access[s.pos[0]][s.pos[1]][s.pos[2]] = true;
}void printStatus(Status &s) {int x, y;for (int i = 0; i < n; ++i) {num2XY(s.pos[i], &x, &y);printf("[%d %d] ", x, y);}printf(" %d\n", s.step);
}void printGraphVec() {int i, j, x, y;for(i = 0; i < 300; ++i) {if(graphVec[i].size()) {num2XY(i, &x, &y);printf("%d %d - ", x, y);for(j = 0; j < graphVec[i].size(); ++j) {num2XY(graphVec[i][j], &x, &y);printf("[%d %d] ", x, y);}putchar('\n');}}putchar('\n');
}void init() {int i, j, k, initLen = 0, suppLen = 0;int x, y;memset(access, 0, sizeof(access));for(i = 0; i < 300; ++i) {graphVec[i].clear();}for (i = 1; i <= h; ++i) {while (getchar() != '\n') ;for (j = 1; j <= w; ++j) {graph[i][j] = getchar();if (graph[i][j] >= 'a' && graph[i][j] <= 'z')initPoints[initLen++] = {char(graph[i][j]), xy2Num(i, j)};if (graph[i][j] >= 'A' && graph[i][j] <= 'Z')suppPoints[suppLen++] = {char(graph[i][j]), xy2Num(i, j)};}}for(i = 2; i < h; ++i) {for (j = 2; j < w; ++j) {if(graph[i][j] == '#') continue;for(k = 0; k < 4; ++k) {x = i + steps[k][0];y = j + steps[k][1];if(graph[x][y] == '#') continue;graphVec[xy2Num(i, j)].push_back(xy2Num(x, y));}}}// printGraphVec();for (i = 0; i < n; ++i) {origin.pos[i] = initPoints[i].pos;for (j = 0; j < n; ++j) {if (sameLetter(initPoints[i].ch, suppPoints[j].ch)) {terminal.pos[i] = suppPoints[j].pos;break;}}}origin.step = 0;terminal.step = 0;setAcc(origin);// printStatus(origin);// printStatus(terminal);
}bool judgePos(Status &s) {int i, j;for (i = 0; i < n; ++i) {for (j = 0; j < n; ++j) {if (i == j) continue;if (s.pos[i] == s.pos[j]) return false;}}return true;
}int compute() {int i, j, k, a1, a2, a3;int num1, num2, num3, len1, len2, len3;queue<Status> qu;Status s0, s1, s2, s3;qu.push(origin);while (!qu.empty()) {s0 = qu.front();qu.pop();// putchar('\n');// printStatus(s0);s0.step++;for (i = 0; i < n; ++i) {num1 = s0.pos[i]; len1 = graphVec[num1].size();for (a1 = 0; a1 < len1; ++a1) {s1 = s0;s1.pos[i] = graphVec[num1][a1];if (!judgePos(s1)) continue;if (!judgeAcc(s1)) {// printStatus(s1);setAcc(s1); qu.push(s1);}if (statusEqual(s1, terminal)) return s1.step;for (j = 0; j < n; ++j) {if (i == j) continue;num2 = s1.pos[j]; len2 = graphVec[num2].size();for (a2 = 0; a2 < len2; ++a2) {s2 = s1;s2.pos[j] = graphVec[num2][a2];if (!judgePos(s2)) continue;if (!judgeAcc(s2)) {// printStatus(s2);setAcc(s2); qu.push(s2);}if (statusEqual(s2, terminal)) return s2.step;for (k = 0; k < n; ++k) {if (k == i || k == j) continue;num3 = s2.pos[k]; len3 = graphVec[num3].size();for (a3 = 0; a3 < len3; ++a3) {s3 = s2;s3.pos[k] = graphVec[num3][a3];if (!judgePos(s3)) continue;if (!judgeAcc(s3)) {// printStatus(s3);setAcc(s3); qu.push(s3);}if (statusEqual(s3, terminal)) return s3.step;}}}}}}}
}int main() {while (scanf("%d %d %d", &w, &h, &n) == 3 && w != 0) {init();printf("%d\n", compute());}return 0;
}
相关文章:
UVA-1601 万圣节后的早晨 题解答案代码 算法竞赛入门经典第二版
GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 以三个点的当前位置作为状态,广度优先遍历,找到终点即为最短次数。 注意: 一次可以移动多个点,但是每个点只能移动一步。在同一次中…...
nacos 403错误
403错误 2023-08-12 18:04:55,418 [main] ERROR [com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder:106] [trace,span,parent] - get data from Nacos error,dataId:gateway-server.yaml, com.alibaba.nacos.api.exception.NacosException: <html><body&…...
Python遥感图像处理应用篇(三十四):GDAL+Scikit-image+GLCM计算遥感图像纹理特征
1.运行环境 GDAL 3.4.2,Scikit-image最新版本0.19.3,numpy1.21.5 GDAL主要用于实现图像的读取和保存,Scikit-image和numpy对图像进行各种计算处理。 在调试好之前,由于numpy版本(1.16.6)低的问题,运行提示如下错误,更新为1.21.5版本之后就可以正常运行了,在此记录一…...
solr迁移到另一个solr中(docker单机)
背景介绍 solr数据迁移,或者版本升级,需要用到迁移,此处记录一下迁移方法以及过程中遇到的问题。我这边使用的是docker环境,非docker部署的应该也是一样的。 solr部署教程 准备工作 ● solrA 版本: 8.11.2 (已有so…...
谁能讲清楚Spark之Spark系统架构
### 整体架构概述 Spark与Hadoop MapReduce的结构类似,Spark也采用Master-Worker结构。如果一个Spark集群由4个节点组成,即1个Master节点和3个Worker节点,那么在部署Standalone版本后,Spark部署的系统架构图如图2.1所示。简单来说,Master节点负责管理应用和任务,…...
力扣:59. 螺旋矩阵 II(Python3)
题目: 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全…...
【electron】electron项目创建的方式:
文章目录 【1】npm init quick-start/electron(推荐)【2】 克隆仓库,快速启动【3】 通过脚手架搭建项目【4】 手动创建项目 【Electron官网】https://www.electronjs.org/zh/docs/latest/api/app 【1】npm init quick-start/electron…...
Vim学习(一)——基本命令与三种模式
写在前面, 致敬 8月3日,Vim创始人Bram Moolenaar去世,在此向老爷子致敬!感谢他为这个世界带来的优秀编辑器Vim。 基本介绍 Vim全称叫Vi IMproved. 而vi则是Visual Interface的缩写,他们处理都是ASCII码字符数据&am…...
unity新输入系统的简单使用(New InputSystem)
1、在包管理器 unity注册表中下载安装InputSystem 2、给玩家添加组件PlayerInput,点击CreatAction,创建一个InputAct InputAct,这是玩家的输入文件,在里面可以设置玩家输入 3、使用 例如玩家控制角色移动 在InputAct中,默认已经设置好了移…...
Redis——特性介绍与应用场景
Redis特性介绍 In-memory data structrues 众所周知,MySQL是一种关系型数据库,其通过表的结构存储数据,就类似于建立了一个excel表格来存储数据。但是像视频这类数据并不适合存储在关系型数据库中,因此存在非关系型数据库——通…...
网络:路由
1. 路由器 路由器工作在三层,每个接口都处于不用的网段中,即不同的广播域。但大多情况下,两台路由器直接相连的接口是同一个广播域,即一个网段。 路由器具有判断网络地址和选择路径的功能,能在多网络互联的环境中&…...
利用三维内容编辑器制作VR交互课件,简单好用易上手
随着虚拟现实技术的不断发展,越来越多的教育机构开始尝试将其应用于教育教学中。然而,要实现这一目标并不容易,需要专业的技术支持和开发团队。 为了解决这一问题,广州华锐互动研发了三维内容编辑器,它是一种基于虚拟现…...
中国首款量子计算机操作系统本源司南 PilotOS正式上线
中国安徽省量子计算工程研究中心近日宣布,中国国产量子计算机操作系统本源司南 PilotOS 客户端正式上线。 如果把量子芯片比喻成人的“心脏”,那么量子计算机操作系统就相当于人的“大脑”,量子计算应用软件则是人的“四肢”。 据安徽省量子…...
基层社会治理平台建设方案[113页PPT]
导读:原文《基层社会治理平台建设方案[113页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需获取完…...
认识vite
一.了解vite的不同版本的更新 vite1版本是基于vue项目的,无法跨框架使用vite2可以跨框架(vue2,vue3,react)vite3模板变更;vite cli优化;import.meta.glob API变化;其他vite4主版本主…...
华为运动健康,十年创新天地宽
我听一位朋友讲过这样一个故事。某天早上,急诊科的医生迎来了一位患者,患者进来后直接说:“大夫,我房颤了。” 这位医生非常诧异,因为心脏房颤确实非常危急,但很多时候并没有明显的生理体征,患者…...
深度学习(37)—— 图神经网络GNN(2)
深度学习(37)—— 图神经网络GNN(2) 这一期主要是一些简单示例,针对不同的情况,使用的数据都是torch_geometric的内置数据集 文章目录 深度学习(37)—— 图神经网络GNN(…...
Unity游戏源码分享-乐节奏休闲游戏源码 guitar hero 支持mobile
Unity游戏源码分享-乐节奏休闲游戏源码 guitar hero 支持mobile 完整版下载地址:https://download.csdn.net/download/Highning0007/88198766...
VS Code配置Prettier格式化Apex
先决条件 安装nodejs和npm安装vs code安装salesforce extension pack 配置Prettier Apex 创建本地Salesforce项目 (Standard) command shift p -> SFDX: Create Project with Manifest -> Standard 打开terminal运行npm init生成package.json文件 安装prettier ap…...
Spring-Cloud-Loadblancer详细分析_4
在RoundRobinLoadBalancer.choose中的serviceInstanceListSupplierProvider就是获取服务列表的关键,那么此对象是怎么拿到的呢,让我们回到RoundRobinLoadBalancer的创建过程 Configuration(proxyBeanMethods false) ConditionalOnDiscoveryEnabled pub…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
