【数据结构•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表】重排九宫…相关推荐

  1. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  2. e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗

    #新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...

  3. 数据结构——哈希表(Hash表)、哈希碰撞

    1.概述 哈希表(也叫散列表),是根据键(Key)直接访问在内存存储位置的数据结构.就是一种以 键-值(key-value) 存储数据的结构,我们只要输入key,就可查找到其对应的值. hash函数就 ...

  4. 0x14.基础数据结构 — hash表与字符串hash

    目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...

  5. hash表建立 很久没写数据结构了

    /** auhtor:lx date 4.9 2011 brief hash table */ #include <stdio.h> #include <stdlib.h> # ...

  6. 数据结构:通过hash表方法创建母猪信息录入系统

    一.创建主MakeFile 1.先在主目录分别创建四个文件夹,分别是:src  .   include  .  obj  .   bin  ,然后在主目录创建makefile文件. OBJS:=mai ...

  7. 数据结构:通过hash表建立一个宝可梦图鉴管理系统

    1. 建立工程文件夹 bin.obj.src.include 2.创建主makefile文件 OBJS:=test.o pokemon.o CC:=gcc CFLAGS:=-c -g -Wall My ...

  8. 数据结构 单词查找 二分法-索引表-Hash表

    问题说明: 从标准输入中读入一个英文单词及查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt中查找该单词,返回查找结果(查找到返回1,否则返回0)和查找过程中单词的比较次数 ...

  9. 从头到尾彻底解析Hash表算法

    从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26  阅读: 25156 次  推荐: 14   原文链接   [收藏]   作者:July.wuliming.pkuoliv ...

最新文章

  1. gestureRecognizer
  2. 单片机中通用的类型别名
  3. 安装squid_「首席推荐」设置Squid转发代理或者正向代理
  4. 终于有人把Elasticsearch原理讲明白了!
  5. Python抽象类介绍
  6. Laravel核心解读--服务容器(IocContainer)
  7. 记一次tomcat故障排查(转)
  8. 服务器内的虚拟机无法上网,VMware虚拟机中无法上网如何解决
  9. 22_粗粒度权限控制
  10. 解决面部毛孔粗大的7个小窍门 - 健康程序员,至尚生活!
  11. JAVA判断两个数是否亲和数_亲和数
  12. Linux环境下搭建Apache服务器(完整版)
  13. JZ-008-跳台阶
  14. 25款顶级的jQuery表格插件
  15. 竞赛通知|2021年全国大学生电子设计竞赛启动通知!
  16. python函数五要素_python之基础篇(二)
  17. 金蝶登录显示服务器离线,金蝶云服务器已离线 登陆不了
  18. EPLAN电气图纸项目案例完整项目图纸
  19. 易语言 mysql多线程_易语言数据库多线程 易语言数据库教程
  20. 富士XT3 xf16-55 f2.8 胶片性能体验测试

热门文章

  1. redis key格式约定
  2. 通联数据以AI预测上市公司业绩,探索投研新模式
  3. 12.16库的相关知识与补充
  4. 爬虫2--爬取豆瓣网热映电影
  5. 守一隅静美,醉一域风情
  6. 如何准备一线互联网公司面试?
  7. 普通PC机支持内存128G,单条32G内存
  8. I9003静态图片的位置及蓝牙发送
  9. PDB文件详解一:标题部分
  10. java实战:jsp快速实现简单易用的信息登记与查询功能