【数据结构bull;hash表】重排九宫…
【数据结构•hash表】重排九宫
Time Limit:10000MS Memory Limit:65536K
Total Submit:47 Accepted:15
Description
我先来说几句:
====================================================================================================
下面大家即将见到的是一道经典的广度搜索(bfs)题,bfs算法的运行耗时主要集中在状态扩展和状态判重上,大部分情况下,状态判重的耗时是远大于状态扩展的(假设可能扩展的状态数量为n,则其运算量分别为:o(n)和o(n^2)),如果在bfs算法中使用hash表去判重,则可以极大的提高运行效率。因此,bfs+hash,会是解决相当多搜索题的杀手锏!
就下面例题而言,注意到每种状态构成了一个排列,我们可以给它分配一个编号,总共的状态数不会超过9!=362880种。(关于排列直接换算分配hash地址,可以见P1511理论基础知识,因此题状态数比较少,你可以使用简化的散列(hash)函数解决此题)。
====================================================================================================
问题来了,重排九宫:
将数字1~8按照人依次序排在3*3的方格阵列中,留下一个空位供数字方块移动,游戏的最终目标是通过合法移动将数字按行排好序。
输入举例:
目标:
输出达到目标状态的最少移动次数。
Input
3*3的输入方阵,格式见样例。
Output
一个整数,达到目标状态的最少移动次数。
Sample Input
1 2 3 4 0 6 7 5 8
Sample Output
2
Hint
本题测试数据贡献者:肖遥
Source
哈希表+广搜
哈希函数:先把二维转为一维,在用“康托展开式”,把一维转换成一个数。
康托展开式:一个排列在全排列中的位置。具体见http://baike.baidu.com/view/437641.htm
var
head,tail:longint;
a:array[0..10]of longint;
f:array[0..362880,0..10]of longint;
h:array[1..362880]of boolean;
procedure hash;
var
i,j,s,e,k:longint;
begin
s:=1;
k:=1;
for i:=9-1 downto 1 do
begin
e:=0;
for j:=i+1 to 9 do
if a[j]<a[i] then inc(e);
s:=s+e*k;
k:=k*(9-i+1);
end;
f[0,10]:=-1;
if s=46234 then begin
write(f[head,10]+1); halt; end;
if h[s]=false then
begin
h[s]:=true;
inc(tail);
f[tail]:=a;
f[tail,10]:=f[head,10]+1;
end;
end;
procedure init;
var
i,j:longint;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
read(a[(i-1)*3+j]);
if a[(i-1)*3+j]=0 then a[0]:=(i-1)*3+j;
end;
tail:=0;
head:=0;
hash;
end;
procedure change(i:longint);
begin
a:=f[head];
a[a[0]]:=a[a[0]+i];
a[a[0]+i]:=0;
a[0]:=a[0]+i;
hash;
end;
procedure bfs;
var
i:longint;
begin
head:=1;
tail:=1;
f[1,10]:=0;
while true do
begin
if f[head,0]mod 3=0 then
begin
change(-1);
if f[head,0]<>9 then change(3);
if f[head,0]<>3 then change(-3);
end;
if f[head,0]mod 3=2 then
begin
change(-1);
change(1);
if f[head,0]<>8 then change(3);
if f[head,0]<>2 then change(-3);
end;
if f[head,0]mod 3=1 then
begin
change(1);
if f[head,0]<>7 then change(3);
if f[head,0]<>1 then change(-3);
end;
inc(head);
end;
end;
begin
fillchar(h,sizeof(h),0);
init;
bfs;
end.
【数据结构bull;hash表】重排九宫…相关推荐
- NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...
- e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗
#新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...
- 数据结构——哈希表(Hash表)、哈希碰撞
1.概述 哈希表(也叫散列表),是根据键(Key)直接访问在内存存储位置的数据结构.就是一种以 键-值(key-value) 存储数据的结构,我们只要输入key,就可查找到其对应的值. hash函数就 ...
- 0x14.基础数据结构 — hash表与字符串hash
目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...
- hash表建立 很久没写数据结构了
/** auhtor:lx date 4.9 2011 brief hash table */ #include <stdio.h> #include <stdlib.h> # ...
- 数据结构:通过hash表方法创建母猪信息录入系统
一.创建主MakeFile 1.先在主目录分别创建四个文件夹,分别是:src . include . obj . bin ,然后在主目录创建makefile文件. OBJS:=mai ...
- 数据结构:通过hash表建立一个宝可梦图鉴管理系统
1. 建立工程文件夹 bin.obj.src.include 2.创建主makefile文件 OBJS:=test.o pokemon.o CC:=gcc CFLAGS:=-c -g -Wall My ...
- 数据结构 单词查找 二分法-索引表-Hash表
问题说明: 从标准输入中读入一个英文单词及查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt中查找该单词,返回查找结果(查找到返回1,否则返回0)和查找过程中单词的比较次数 ...
- 从头到尾彻底解析Hash表算法
从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26 阅读: 25156 次 推荐: 14 原文链接 [收藏] 作者:July.wuliming.pkuoliv ...
最新文章
- gestureRecognizer
- 单片机中通用的类型别名
- 安装squid_「首席推荐」设置Squid转发代理或者正向代理
- 终于有人把Elasticsearch原理讲明白了!
- Python抽象类介绍
- Laravel核心解读--服务容器(IocContainer)
- 记一次tomcat故障排查(转)
- 服务器内的虚拟机无法上网,VMware虚拟机中无法上网如何解决
- 22_粗粒度权限控制
- 解决面部毛孔粗大的7个小窍门 - 健康程序员,至尚生活!
- JAVA判断两个数是否亲和数_亲和数
- Linux环境下搭建Apache服务器(完整版)
- JZ-008-跳台阶
- 25款顶级的jQuery表格插件
- 竞赛通知|2021年全国大学生电子设计竞赛启动通知!
- python函数五要素_python之基础篇(二)
- 金蝶登录显示服务器离线,金蝶云服务器已离线 登陆不了
- EPLAN电气图纸项目案例完整项目图纸
- 易语言 mysql多线程_易语言数据库多线程 易语言数据库教程
- 富士XT3 xf16-55 f2.8 胶片性能体验测试