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

相关文章

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.