八数码难题 (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> ...
随机推荐
- HappyNum
/*Write an algorithm to determine if a number is "happy". A happy number is a number defin ...
- 基于RDBMS的BI设计
================================ 都说BI,什么OLAP,什么ROLAP,MOLAP,但是如何基于RDBMS实现,基本都不怎么说. 怎么做的: 1.通过多维分析模型,存 ...
- Object的toString决定了重写equals
默认的toString结果public String toString(){ return getClass().getName()+"@"+Integer.toHexStr ...
- history.back(-1)和history.go(-1)的区别
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 返回到指定连接:document.l ...
- python修改excel文件
一.导入模块如图
- 基础字符串处理_C++
C++中,有 char [ ] 和 string 两种方式处理字符串 char 数组是最原始的,string 是带迭代器的 正是这种 string 带了迭代器,它会使我们处理字符串很方便,但也十分慢 ...
- 业务gis 搭建一个skyline 的js模板 (一)
刚刚我们说的是二维的系统,如果要展示三维,我们是不是也需要这样,答案是必须的,是一定要,如果你是基于skyline做三维开发,业务开发人员要去搞那套api估计要吐血,所以我们必须得封装起来,这里不介绍 ...
- Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)
Swiftsuspenders2简介 Swiftsuspenders2是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.(对于元数据 ...
- GlusterFS特性介绍
下面是GlusterFS的一些特性 规范的接口 GlusterFS服务器与POSIX兼容,使用支持文件扩展属性的磁盘文件系统(如ext4.XFS)来存储磁盘上的数据.同时,可以通过业界标准的访问协议如 ...
- Windows Azure - App Services
1. 需要了解的概念:App Service Plan, Resource Group 2. Create an ASP.NET web app in Azure App Services 3. Cr ...