AOJ 0121 Seven Puzzle
7 パズル
7 パズルは 8 つの正方形のカードとこれらのカードがぴたりと収まる枠で構成されています。それぞれのカードには、互いに区別できるように 0, 1, 2, ..., 7 と番号がつけられています。枠には、縦に 2 個、横に 4 個のカードを並べることができます。
7 パズルを始めるときには、まず枠にすべてのカードを入れます。枠のなかで 0 のカードだけは、上下左右に隣接するカードと位置を交換することができます。たとえば、枠の状態が図(a) のときに、0 のカードの右に隣接した、7 のカードと位置を交換すれば、図(b) の状態になります。あるいは、図(a) の状態から 0 のカードの下に隣接した 2 のカードと位置を交換すれば図(c) の状態になります。図(a) の状態で 0 のカードと上下左右に隣接するカードは 7 と 2 のカードだけなので、これ以外の位置の入れ替えは許されません。
ゲームの目的は、カードをきれいに整列して図(d) の状態にすることです。最初の状態を入力とし、カードをきれいに整列するまでに、必要な最小手数を出力するプログラムを作成してください。ただし、入力されたカードの状態からは図(d) の状態に移ることは可能であるとします。
入力データは、1 行に 8 つの数字が空白区切りで与えられます。これらは、最初の状態のカードの並びを表します。例えば、図(a) の数字表現は0 7 3 4 2 5 1 6 に、図(c) は 2 7 3 4 0 5 1 6 となります。
![]() |
![]() |
図(a) 0 7 3 4 2 5 1 6 の場合 | 図(b) 7 0 3 4 2 5 1 6 の場合 |
---|
![]() |
![]() |
図(c) 2 7 3 4 0 5 1 6 の場合 | 図(d) 0 1 2 3 4 5 6 7 (最終状態) |
---|
Input
上記形式で複数のパズルが与えられます。入力の最後まで処理してください。 与えられるパズルの数は 1,000 以下です。
Output
各パズルについて、最終状態へ移行する最小手数を1行に出力してください。
Sample Input
0 1 2 3 4 5 6 7
1 0 2 3 4 5 6 7
7 6 5 4 3 2 1 0
Output for the Sample Input
1
28
题意:在2*4的方框里随意填充了0到7共八个数字,每一个点位的数字都可以和相邻点位的数字交换位置,通过这样的交换,最终要使得8个数字(0,1,2...7)顺序的从左往右从上到下依次排列,
即排列成 0 1 2 3
4 5 6 7
思路:深度优先搜索,不断交换某一个元素的位置,可以穷尽所有的情况,不妨不断交换0元素的位置,从01234567这种最特殊的情况开始交换(这种情况交换次数为0),之后0每换一次位置后产生一种新的情况,理所应当的这种情况需要交换的次数为0未交换时情况所需交换次数再加1.以此类推……获得所有情况所需交换次数即可。
代码:
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
map<string, int>dp;//容器里存放每一种情况
int direction[] = { ,-,,- };
void bfs() {
queue<string>que;
que.push("");
dp[""] = ;
while (!que.empty()) {
string s = que.front();que.pop();
int index;
for (int i = ;i < ;i++)
if (s[i] == '') { index = i; break; }
for (int i = ;i < ;i++) {
int x = index + direction[i];
if (x >= && x <= && !(index == && i == ) && !(index == && i == )) {
string next=s;
swap(next[x], next[index]);
if (dp.find(next) == dp.end()) {//说明容器里没有该元素
dp[next]=dp[s]+;
que.push(next);
}
}
} }
}
int main() {
bfs();//找到所有情况的答案
string s;
while (getline(cin,s)) {
s.erase(remove(s.begin(), s.end(), ' '), s.end());
cout << dp[s] << endl;
}
return ;
}
AOJ 0121 Seven Puzzle的更多相关文章
- AOJ 0121: Seven Puzzle【BFS】
From: AOJ 0121 思路:与前几题的bfs不同,这次的bfs没有明确的移动对象,看似任意一个数都可以当成对象移动.这时我们只需要抓住一个格子就行,比如我们把0作为移动对象,那么0在地图中漫游 ...
- AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)
转载自: http://m.blog.csdn.net/blog/Enjoying_Science/42008801 题目链接:http://acm.hust.edu.cn/vjudge/probl ...
- AOJ 0121 Seven Puzzle {广度优先搜索}(*)
原题 题意 题意是有一个输入,比方: 1 0 2 3 4 5 6 7 摆成例如以下形状: 1 0 2 3 4 5 6 7 0表示空格.其它数字能够移动到0的位置.最后须要到例如以下形状: 0 1 2 ...
- Aizu/Aoj 0121 Seven Puzzle
这题应该算是经典的八数码问题的弱化版吧:给你一个4x2的方版,上面有0-7 八个数字,每次只能让编号0的方格跟他的上下左右的方格交换:所以也就是把方格0当做空格看待,每次只有空格周围的方格能够向空格处 ...
- AOJ 0121 广度优先搜索
题意:7数码问题.在2×4的棋盘上,摆有7个棋子,每个棋子上标有1至7的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格(用0表示),与空格相邻(上下左右)的棋子可以移到空格中,该棋子原先位置成 ...
- Aizu 0121 Seven Puzzle(变进制数的完美hash)
一遍预处理跑完所有情况,O(1)回答就好.状态记录我用的康拓和逆康拓. #include<bits/stdc++.h> using namespace std; ]; ]; ]; int ...
- nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……
Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...
- ProgrammingContestChallengeBook
POJ 1852 Ants POJ 2386 Lake Counting POJ 1979 Red and Black AOJ 0118 Property Distribution AOJ 0333 ...
- 【Aizu - 0121】Seven Puzzle (反向bfs)
-->Seven Puzzle 原文是日语 这里就直接写中文了 Descriptions: 7拼图由8个正方形的卡和这些卡片完全收纳的框构成.每张卡都编号为0, 1, 2, …, 7,以便相互 ...
随机推荐
- IT思想类智力题
1. 台阶问题 题目:一个人上台阶可以一次上一个或两个,问这个人上n层的台阶,一共有多少种走法. 本题可以采用递归的方法来设计模型,先从数字的规律入手:假设共有i阶台阶,走完所有的台阶有n种走法,则存 ...
- 时间管理-SMART原则
制定目标有一个“黄金准则”——SMART原则.SMART是英文5个词的第一个字母的汇总.好的目标应该能够符合SMART原则. S(Specific)——明确性 所谓明确就是要用具体的语言清楚地说明要 ...
- 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...
- Android学习笔记④——页面的布局方式
FrameLayout(帧布局) 这个布局的特点是简单的默认把每一个视图组件都放在边框内且放在左上角,即使添加多个视图组件,他们也都是重叠在左上角,新的视图会遮挡住旧的视图.可以根据gravity来改 ...
- XML DTD验证
XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...
- SQL Server之内连接 左连接 右连接 全连接 交叉连接
SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B ...
- 关于bochs用X11启动的说明
关于网络上有很多关于 bochs启动时 连接到X Windows 报错: cannot connect to X display . 昨天搞了半天+晚上 + 今天早上 + 直到现在 才搞懂. 主要的原 ...
- 剑指Offer07 斐波那契数列
/************************************************************************* > File Name: 07_Fibona ...
- php读取mysql中文数据出现乱码
1.PHP页面语言本身的编码类型不合适,这时候,你直接在脚本中写的中文肯定是乱码,不用说数据库了: 解决方法:选择'UTF8'或者'gb2312',这样客户浏览器会自动选择并出现正确的中文显示. ...
- .Net简单上传与下载
上传: 首先上传我们需要一个控件-FileUpLoad: 再加上一个上传按钮: 在上传按钮的Click事件中添加如下代码: FileUpload1.SaveAs(Server.MapPath(&quo ...