八数码难题 (codevs 1225)题解
【问题描述】
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
【样例输入】
283104765
【样例输出】
4
【解题思路】
这题要求最少步数,因此为广度优先搜索,用队列实现。最简单的方法就是直接将每种状态存入3×3的数组中,然后将空格往四个方向移动,直至目标状态。
不过,让我们来看一看样例。
按往常来说,如果是存入3×3的数组中,那么样例中应该是 2 8 3
1 0 4
7 6 5
可是,样例却是一串数字,且中间没有空格,那么,这就给了我们一种思路,以字符串的形式存入,然后搜索,与目标状态比较时也方便一些。那么我们就换成字符串来搜索,但是字符串中要注意一下,第三位不能移到第四位,第四位不能移到第三位,因此,我们需要对该数字进行判断,看它属于哪一列,然后再搜索。
不过,这两种方式都会超时(在输出结果的步数比较大的时候),因此,我们需要判重,然而,直接开一个12345678-876543210的布尔型数组会超时,所以,这里我们用到了哈希优化。
【代码实现】
type rec=record
s:string;
s1,dep:longint;
end;
const di:array[..] of longint=(-,-,,);
c:string='';
var a:array[..] of rec;
b:string;
f,r,i,j,k,x:longint;
flag:array[..] of boolean;
procedure bfs;
var si:char;
i,j,k:longint;
begin
while f<r do
begin
inc(f);
case a[f].s1 of//判断数字属于哪一列
,,:
for i:= to do
if (a[f].s1+di[i]>=)and(a[f].s1+di[i]<=) then
begin
inc(r);
a[r]:=a[f];
a[r].s[a[r].s1]:=a[r].s[a[r].s1+di[i]];
a[r].s[a[r].s1+di[i]]:='';
a[r].s1:=a[r].s1+di[i];
inc(a[r].dep);
val(a[r].s,x);
if not(flag[x mod ]) then
dec(r)
else
begin
flag[x mod ]:=false;
if a[r].s=c then
begin
writeln(a[r].dep);
halt;
end;
end;
end;
,,:
for i:= to do
if (a[f].s1+di[i]>=)and(a[f].s1+di[i]<=) then
begin
inc(r);
a[r]:=a[f];
a[r].s[a[r].s1]:=a[r].s[a[r].s1+di[i]];
a[r].s[a[r].s1+di[i]]:='';
a[r].s1:=a[r].s1+di[i];
inc(a[r].dep);
val(a[r].s,x);
if not(flag[x mod ]) then
dec(r)
else
begin
flag[x mod ]:=false;
if a[r].s=c then
begin
writeln(a[r].dep);
halt;
end;
end;
end;
,,:
for i:= to do
if (a[f].s1+di[i]>=)and(a[f].s1+di[i]<=) then
begin
inc(r);
a[r]:=a[f];
a[r].s[a[r].s1]:=a[r].s[a[r].s1+di[i]];
a[r].s[a[r].s1+di[i]]:='';
a[r].s1:=a[r].s1+di[i];
inc(a[r].dep);
val(a[r].s,x);
if not(flag[x mod ]) then
dec(r)
else
begin
flag[x mod ]:=false;
if a[r].s=c then
begin
writeln(a[r].dep);
halt;
end;
end;
end;
end;
end;
end;
begin
fillchar(flag,sizeof(flag),true);
readln(a[].s);
for i:= to do
if a[].s[i]='' then
begin
a[].s1:=i;
break;
end;
f:=;r:=;
bfs;
end.
八数码难题 (codevs 1225)题解的更多相关文章
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- codevs1225八数码难题(搜索·)
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Yours和zero在研究A*启 ...
- 「LuoguP1379」 八数码难题(迭代加深
[P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
随机推荐
- javaSE学习博客与笔记
equals和==的区别 Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,do ...
- Contains DuplicateII
超时版: /*Contains Duplicate II Given an array of integers and an integer k, find out whether there the ...
- 第二章 D - Number Sequence(1.5.10)
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1301527312 大致题意: 有一串数字串,其规律为 1 12 123 1234 1234 ...
- (转)读取XML数据到treeView中
原文地址,只为收藏:http://www.cnblogs.com/ylwn817/archive/2011/12/15/2288512.html /// <summary> ...
- spring Integration服务总线
最新项目中使用数据交换平台,主要通过交换平台抓取HIS数据库医生医嘱检查检验等数据以及FTP上的txt文件,html等病程文件,生成XML文件,之后通过业务系统按业务规则对数据进行处理,再将其存入数据 ...
- 打印print
<script type="text/javascript"> function printpreview() { try { var HKEY_Root, HKEY_ ...
- Spark ThriftServer使用的大坑
当用beeline连接default后,通过use xxx切换到其他数据库,再退出, 再次使用beeline -u jdbc:hive2://hadoop000:10000/default -n sp ...
- CODESOFT中怎样打印数据库中的特定数据?
CODESOFT可用于打印.标记和跟踪的零售库存标签软件,每种产品的售卖都代表着需要打印大量的条码标签.通常我们采用的方法就是在CODESOFT连接数据库批量打 印.但是如果数据量很大,该如何选择 ...
- OSChina中远程GIT仓库同步探索
GIT平台在OSChina中的搭建帮了我们很大的忙,但如何将本地GIT仓库上传至OSChina的远程仓库,相信这是一个艰难的坎,今天我就在此总结我的成功经验,帮助大家,共同学习.由于条件有限,我全部的 ...
- 使用ImageNet在faster-rcnn上训练自己的分类网络
具体代码见https://github.com/zhiyishou/py-faster-rcnn 这是我对cup, glasses训练的识别 faster-rcnn在fast-rcnn的基础上加了rp ...