hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

2024-09-09 17:48

本文主要是介绍hdu1043(八数码问题,广搜 + hash(实现状态压缩) ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>#define eps 1e-9
#define N 400000
#define P system("pause")
using namespace std;
struct node
{int map[9];int zero;int hash_id;     
};
int fac[]={1,1,2,6,24,120,720,5040,40320};
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //因为是逆序查找,所以上下左右,变成了 
char dir[]={'d','u','r','l'};                                              //下上右左   
int hash[N];
string path[N];
int cantor(int *s)     //康拓扩展求hash值 
{int count,i,j;int sum=0;for(i=0;i<8;i++){count=0;for(j=i+1;j<9;j++)if(s[i]>s[j])  count++;sum+=(fac[8-i]*count);          }return sum;
}void bfs()
{                   //从目标开始逆向搜索,枚举每种可能出现的排列int i;node u,v;u.zero=8;u.map[8]=0;for(i=0;i<8;i++)u.map[i]=i+1;u.hash_id=cantor(u.map);           hash[u.hash_id]=1;path[u.hash_id]="";queue<node> q;q.push(u);while(!q.empty()){u=q.front();q.pop();int x=u.zero/3;        //找到0的位置 int y=u.zero%3;for(i=0;i<4;i++){int nx=x+d[i][0];int ny=y+d[i][1];if(nx>=0 && nx<3 && ny>=0 && ny<3){int k=nx*3+ny; //一维数组下标                     v=u;v.zero=k;v.map[u.zero]=u.map[k];v.map[k]=0;v.hash_id=cantor(v.map);}if(!hash[v.hash_id]){hash[v.hash_id]=1;path[v.hash_id]=path[u.hash_id];path[v.hash_id]+=dir[i];                                  q.push(v);                      }}                 }}int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);ccmemset(hash,0,sizeof(hash));bfs();char c;int s[9];while(cin>>c){if(c=='x') s[0]=0;else s[0]=c-'0';for(int i=1;i<9;i++)        {cin>>c;if(c=='x') s[i]=0;else s[i]=c-'0';        }int k=cantor(s);if(!hash[k])  printf("unsolvable\n");else{string ss=path[k];reverse(ss.begin(),ss.end()); cout<<ss<<endl;    }}   //P;                               return 0;    
}


这篇关于hdu1043(八数码问题,广搜 + hash(实现状态压缩) )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1151856

相关文章

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到