1、题目类型:模拟、哈希表、BFS。

2、解题思路:(1)模拟Eigh Puzzle的变换方式,并记录在数组中 ;(2)由于变换的最终结果相同,所以采用反向的BFS遍历所有情况,并记录所有情况;(3)在查找情况过程中采用二进制哈希表形式,以便于查找;(4)根据题目每个输入的case对表中进行对应查找,直接输出答案。

3、注意事项:注意哈希表方式,否则TLE。

4、实现方法:(由于又借用模板,所以代码有点乱)

#include<iostream>
#include<string>
using namespace std;

const int r[] = {0,1,4,3,0,3,4,1,1,2,5,4,1,4,5,2,3,4,7,6,3,6,7,4,4,5,8,7,4,7,8,5};
int final[] = {69074,77576,135289,157120,205759,227590,285303,293805};
int p[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};
int d[362880], q[362880];
int s[9];
int Encode(int* s)
{
int i,j,k,x = 0;
for(i=0;i<9;i++)
{
k = s[i];
for(j=0;j<i;j++)
if(s[j]<s[i])
k--;
x+=k*p[8-i];
}
return x;
}

void Decode(int* s, int x)
{
int i,j;
for(i=0;i<9;i++)
{
s[i]=x/p[8-i];
x%=p[8-i];
}
for(i=8;i>=0;i--)
for(j=8;j>i;j--)
if(s[j]>=s[i])
s[j]++;
}

void Init()
{
int i,x,y,front,rear,ss[9];
memset(d,-1,sizeof(d));
for(i=0;i<9;i++)
ss[i]=i;
q[0]=Encode(ss);
d[q[0]]=0;
front=0, rear=1;
while(front<rear)
{
x = q[front++];
Decode(s,x);
{
for(i=0;i<9;i++)
{
if(s[i]==8)
break;
}
if(i!=0 && i!=1 && i!=2)
{
s[i]=s[i-3];
s[i-3]=8;
y=Encode(s);
if(d[y]<0)
{
d[y] = d[x] + 1;
q[rear++] = y;
}
s[i-3]=s[i];
s[i]=9;
}
if(i!=2 && i!=5 && i!=8)
{
s[i]=s[i+1];
s[i+1]=8;
y=Encode(s);
if(d[y]<0)
{
d[y]=d[x]+1;
q[rear++]=y;
}
s[i+1]=s[i];
s[i]=8;
}
if(i!=6 && i!=7 && i!=8)
{
s[i]=s[i+3];
s[i+3]=8;
y=Encode(s);
if(d[y]<0)
{
d[y]=d[x]+1;
q[rear++]=y;
}
s[i+3]=s[i];
s[i]=8;
}
if(i!=0 && i!=3 && i!=6)
{
s[i]=s[i-1];
s[i-1]=8;
y=Encode(s);
if(d[y]<0)
{
d[y]=d[x]+1;
q[rear++]=y;
}
s[i-1]=s[i];
s[i]=8;
}
}
}
}

int main()
{
int i,T;
char ch;
Init();
cin>>T;
while(T--)
{
for(i=0;i<9;i++)
{
cin>>ch;
if(ch=='#')
s[i]=8;
else
s[i]=ch-'1';
}
if(d[Encode(s)]!=-1)
cout<<d[Encode(s)]<<endl;
else
cout<<"impossible"<<endl;
}
return 0;
}

转载于:https://www.cnblogs.com/yongze103/archive/2010/09/27/1837122.html

Eight puzzle --HOJ 11918相关推荐

  1. HOJ题目分类//放这儿没事刷刷学算法!嘻嘻!

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  2. HOJ 题目分类 by wywcgs

    简单题(包含模拟.数论中最基础的题):1001 A+B1002 A+B+C1004 Prime Palindromes1010 The Angle1011 UNIX ls1012 Decoding T ...

  3. 学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:48场讲座(6h 38m) |大小解压后:2.8 G ...

  4. 【杭电ACM】1097 A hard puzzle

    [杭电ACM]1097  A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...

  5. 补第四周作业总结——8 puzzle

    8 puzzle已经提供了解决思路,早期的人工智能算法A.我只能感觉它的神奇,但是没法创造性地使用它.只能按部就班地完成这周的作业. 难点在于对过程的不理解.这个33的格子搜索算法没有尽头,随着步数的 ...

  6. UVA227 Puzzle

    问题链接:UVA227 Puzzle.基础训练级的问题,用C语言编写程序. 问题简述:一个5×5的网格,一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上.下.左. ...

  7. UVa10639 Square Puzzle(WA)

    例子通过了,并且udebug上的例子也通过了,但是提交还是错误. 针对特殊情况: 3 4 7 0 2 1 2 2 3 3 2 4 2 4 4 0 4 7 0 0 4 0 4 2 3 2 2 1 1 2 ...

  8. HOJ 1991 Happy 2005 HOJ 2635 Weights 快速幂

    http://acm.hit.edu.cn/hoj/problem/view?id=1991 HOJ 1991 Happy 2005 My Tags 矩阵快速幂   (Edit)   Source : ...

  9. 【37.50%】【codeforces 745B】Hongcow Solves A Puzzle

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

最新文章

  1. Android Studio 选项菜单和动画结合_谷歌准备为Android增加像iOS一样的功能
  2. _matroska_decode_buffer in
  3. 初识遗传算法 蚁群算法
  4. Excel中vlookup函数的使用方法
  5. c语言打印菱形_没事了,搞一下C语言打印大小可变的菱形图案?
  6. prompt 你到底行不行?
  7. @程序员,京东面试官让你谈谈注册中心的问题!
  8. 面经——算法题数据输入输出
  9. vue 中使用 js-xlsx 导出数据导 excle, 支持多 sheet
  10. android 自由落体,自由落体手游
  11. 大家看看这样可以生成SPWM波吗
  12. python语言基础(傻瓜式文档)
  13. Edge浏览器设置网速限制
  14. Using platform encoding (UTF-8 actually) to copy filtered resources错误
  15. C# 使用正则表达式提取文字
  16. 【EGE】五子棋小游戏 (鼠标控制)
  17. Parameter number 2 is not an OUT parameter 问题的解决方法
  18. 数字城市地理信息公共平台软件测评大纲
  19. GICv3-4宏观视图
  20. 设计模式之 Interpreter(解释器) 通俗理解

热门文章

  1. python将csv文件拆分_【中年阿姨python入门】CSV文件拆分(DictReaderDictWriter)
  2. Spring-Boot-Bean的使用,@Repository,@Service,@Controller,@Component
  3. 关于ftp的说法错误的是_斯坦福教授:成长型思维的养成,只需要换个说法,思维是可以训练的!...
  4. Docker(一):这可能是最为详细的Docker入门总结
  5. 送你一份 Kubernetes 实用命令速查表
  6. svn 命令行创建和删除 分支和tags
  7. 用户信息检索另一台服务器,客户机上一用户访问另一台机器上的informix数据库...
  8. php 位深度,javascript - 流程图获取深度,求各位算法高手帮帮忙
  9. 运维中的MySQL数据库管理方式
  10. python有多态特性吗_Python:多态、协议和鸭子类型