笔记:记录状态并判重的方法

题目(八数码问题)

编号为1-8的8个正方形滑块被摆成3行3列(有一个格子留空),如下图所示

815
736
42

每次可以把与空格相邻的滑块(有公共边才算相邻)一道空格中,而它原来的位置就成为了新的空格。给定初始局面和目标局面(用0表示空格),你的任务是计算出最少的移动步数。如果无法到达目标局面,则输出-1

解法思路

简单来说就是无权图的最短路径问题(和我昨天看到的魔方问题差不多),可以用bfs来做

如果想看看有权图的最短路径问题,可以看看下面这题:

OpenJudge - 19G:海拔

我做这题的思路:

好了言归正传

这题难点在于对状态的记录的问题:如果声明一个9维数组vis,总共有9^9=387420489个项,太多了,内存直呼根本塞不下。如果把9个元素合并成一个数字,最大的数字是876543210,甚至更大

而实际的结点数量并没有这么多,0~8的全排列只有9!= 362990个,如果按照上面的方法,有大量的内存会被浪费

方法一

直接使用STL的集合set。把状态转化为9位十进制整数,就可以用set<int>判重了

set<int> vis;
void init_lookup_table{vis.clear();}
int try_to_insert(int s){
    int v = 0;
    //将s中的状态转化为数字并放入v中(伪代码)
    if(vis.count(v)) return 0;
    vis.insert(v);
    return 1;
}

很简单对吧,但是效率低,建议在时间紧迫或对效率要求不太高的情况下使用

方法二

把排列“变成”整数,然后只开一个一维数组。也就是说,设计一套排列的编码和解码函数,把0~8的全排列和0~362879的整数一一对应起来

int vis[362880], fact[9];
void init_lookup_table(){
    fact[0] = 1;
    for(int i = 1; i < 9; i++) fact[i] = fact[i - 1] * i;
}
int try_to_insert(int s){
    int code = 0; //把st[s]映射到整数code(st为二维数组,记录状态,第二维记录各个数字)
    for(int i = 0; i < 9; i++){
        int cnt = 0;
        for(int j = i + 1; j < 0; j++) if(st[s][j] < st[s][i]) cnt++;
        code += fact[8 - i] * cnt;
    }
    if(vis[code]) return 0;
    return vis[code] = 1;
}

屌吧,屌爆了

原理巧妙(我根本想不到),时间效率也非常高,但编码解码法的适用范围并不大:如果总结点数非常大,编码也会非常大,数组还是开不下

方法三

想必诸位都猜到了

使用哈希技术。简单地说,就是要把结点“变成”整数,但是不必一一对应。换句话说,只需设计一个所谓的哈希函数h(x),然后将任意结点x映射到某个给定范围[0, M - 1]的整数即可,其中M是程序员根据可用内存大小自选的。在理想情况下,只开一个大小为M的数组就能完成判重,但此时往往会有不同结点的哈希值相同,因此需要把哈希值相同的状态组织成链表

typedef int State[9];
const int hashsize = 1000003;
const int maxstate = 1000000;

State st[maxstate];//状态数组
int head[hashsize], next[maxstate];
void init_lookup_table(){memset(head, 0, sizeof(head);}
int hash(State &s){
    int v = 0;
    for(int i = 0; i < 9; i++) v = v * 10 + s[i];//把9个数字组成9位数
    return v % hashsize;//确保哈希值是不超过哈希表大小的非负整数
}
int try_to_insert(int s){
    int h = hash(st[s]);
    int u = head[h];
    while(u){
        if(memcmp(st[u], st[s], sizeof(st[s])) == 0) return 0;//找到了,不用插入
        u = next[u];//继续找
    }
    next[s] = head[h];
    head[h] = s;
    return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS中国IAM用户强制使用MFA

问题 需要对IAM用户强制使用MFA方式进行登陆。 步骤 创建强制MFA登陆策略 找到策略创建入口&#xff0c;如下图&#xff1a; 将下述内容json策略内容&#xff0c;复制到编辑器里面&#xff0c;具体内容和操作如下&#xff1a; {"Version": "2012-10-17&qu…

JVS开源底座与核心引擎的全方位探索,助力IT智能、高效、便捷的进化

引言 JVS产品的诞生背景 JVS是软开企服构建的一站式数字化的解决方案&#xff0c;产生的背景主要来源于如下几个方面&#xff1a; 企业数字化需求的增长&#xff1a;企业对IT建设的依赖程度越来越高&#xff0c;数字化、指标化的经营已经是很多企业的生存的基础和前提&#…

工控 UI 风格美轮美奂

工控 UI 风格美轮美奂

揭秘未来艺术:AI绘画工具全面介绍

&#x1f4d1;前言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面。在艺术创作领域&#xff0c;AI技术同样展现出了其独特的魅力。今天&#xff0c;我们就来一起探索这个神秘而引人入胜的领域&#xff0c;深入了解AI绘画…

车联网全方位安全适配与领先架构

设想一下如下场景&#xff1a; 您钟爱的座驾&#xff0c;在毫无外力破坏迹象的情况下&#xff0c;突然被侵入&#xff0c;远程启动&#xff0c;然后绝尘而去… 别以为这只是大银幕上的虚构桥段&#xff0c;事实上&#xff0c;这一幕在现实中已经上演。 某款备受欢迎的车型&a…

1.搭建SpringBoot项目三种方式

目录 1.使用Spring Initializr 1.1访问Spring Initializr: 1.2填写项目基本信息 1.3配置项目元数据: 1.4添加依赖: 1.5生成项目: 1.6下载项目: 1.7解压项目: 1.8导入项目到IDE: 1.9运行项目: 1.10创建控制器: 1.11访问应用 2.使用IDE&#xff08;集成开发环境&…

测试基本原则-系统架构师(十六)

1、人口信息的采集处理和利用业务属于&#xff08;&#xff09;。户籍管理属于&#xff08;&#xff09;。 问题1问题2 A政府对公民 B政府对政府 C政府对企业 D公民对政府 解析&#xff1a;人口信息的采集处理和利用属于政府对政府&#xff0c;户籍属于政府对公民 答案&am…

替代LTC3855双通道多相带差分遥测DC-DC同步控制器

特性:双通道、180 定相控制器降低了所需的输入电容和电源感应噪声高效率&#xff1a;达 95%RSENSE 或 DCR 电流检测可编程 DCR 温度补偿0.75%、0.6V 输出电压准确度可锁相固定频率&#xff1a;250kHz 至 770kHz真正的远端采样差分放大器双路 N 沟道 MOSFET 同步驱动宽 VIN 范围…

对于todesk共享剪切板不好用的问题记录

todesk 远程复制粘贴 共享剪切版 1.对于已经开启todesk里面的共享剪切板设置的2. 如果此时仍不能远程复制粘贴&#xff0c;可以考虑查看快捷键映射的问题 1.对于已经开启todesk里面的共享剪切板设置的 2. 如果此时仍不能远程复制粘贴&#xff0c;可以考虑查看快捷键映射的问题 …

混合密码系统解析

1. 概述 混合密码系统(hybrid cryptosystem)是将对称密码和非对称密码的优势相结合的方法。一般情况下&#xff0c;将两种不同的方式相结合的做法就称为混合(hybrid)。用混合动力汽车来类比的话,就相当于是一种将发动机(对称密码)和电动机(非对称密码)相结合的系统。 混合密码系…

openstack-同一物理机中透传不同GPU时的nova配置记录

文章目录 前言一、不同加速卡的型号信息二、计算节点增加配置信息1.nova-compute服务的nova.conf 三、控制节点增加配置信息1.nova-conductor服务的nova.conf2.nova-scheduler服务的nova.conf3.nova-api服务的nova.conf 四、准备实例模版五、进行测试&#xff0c;创建虚拟机、检…

400技术汇 教你如何成为抓包高手!

Wireshark是目前使用最广泛的网络抓包分析工具&#xff0c;也是每一位网络攻城狮电脑里必装神器。当网络里发现恶意攻击、某人下载流量过大、设备互联丢包、协议交互失败等等情况时&#xff0c;通过Wireshark抓包定位问题根源&#xff0c;是最直接有效的手段。 然而如此强大的…

Excel 解析十六进制并查找

A1 格由多个人名及其考勤情况组成&#xff0c;比如&#xff0c;c 是十六进制的 1100&#xff0c;表示第 1、2 天到场&#xff0c;第 3、4 天缺席。目前只有 4 天的考勤。 AB1alice,c,bob,7,clara,a,mike,9/input: name and presence22/input: the day to be queried 要求根据…

conda install xformers -c xformers/label/dev 的安装问题

在StableSR项目框架中&#xff0c;需要执行 conda install xformers -c xformers/label/dev 但是报错&#xff0c;错误显示&#xff0c;版本不匹配&#xff0c;如下所示&#xff1a; 我改用pip来安装&#xff0c;好像就不报错了&#xff1a; pip install xformers

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的&#xff0c;这些和漂流都关联不上&#xff0c;直到最近看了一些网站&#xff0c;发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面&#xff1a; 稳重和专业感&#xff1a; 政务类网站需要给人以稳重、正…

【HW必备】用友NC-Cloud存在17处漏洞合集

漏洞简介 NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构&#xff0c;技术先进、性能稳定、自主安全可控&#xff0c;支撑大中型以及超大型集团企业N层多site混合云部署方案&#xff0c;支持整个系统高可…

前端也需要知道的一些常用linux命令

前端也需要知道的一些常用linux命令 1.问题背景2.连接工具&#xff08;SecureCRT_Portable&#xff09;a.下载工具b.连接服务器c.登录到root账户 3.基本命令a.cd命令和cd ..b.ll命令和ls命令c:cp命令d.rm命令e:rz命令f.unzip命令g.mv命令h.pwd命令&#xff08;这里没有用到&…

Isaac Lab 使用 Stable Baselines3 实现 Multi Input Policy

目前Isaac Lab支持的强化学习框架 Isaac Lab支持的强化学习框架介绍http://t.csdnimg.cn/h8u7Z调研下来&#xff0c;能够实现字典状态量&#xff0c;也就是多输入状态量的有 rsl_rl、sb3、(skrl不确定)&#xff0c;rl_games是显然不支持的&#xff0c;自己改了一版&#xff0…

servlet的生命周期

1、Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法&#xff0c;什么时候销毁。 对象的生命周期: Student student new Student(); //创建对象 student.setName("eric"); // 使用对象 student.show();// 使用对象 student null; // 销毁…

踩坑——VS添加相对路径

需求&#xff1a;我需要将模型放到程序里面。 过程&#xff1a;附加包含目录添加目录&#xff0c;发现找不到onnx模型文件。我就想是不是相对路径不对&#xff0c;该来搞去都不对。 解决办法&#xff1a; 相对路径值得是运行程序的当下环境&#xff0c;什么是运行程序呢&…