三阶平面魔方(BFS)
有一个 3×3 的平面魔方,在平面魔方中,每个格子里分别无重复地写上 1 - 9 这 9 个数字。一共有 4 种对平面魔方的操作:
- 选择某一行左移。
- 选择某一行右移。
- 选择某一列上移。
- 选择某一列下移。
初始状态为
123
456
789
比如选择第一行左移,魔方会变成下面这样
231
456
789
现在给出魔方的一个状态,问你能否将魔方复原成初始状态。如果可以,计算最少操作次数。
输入格式
输入三行,每行三个 1 到 9 之间的整数。
输出格式
如果能还原成初始状态,输出最小的操作次数,否则输出 -1。
样例输入
样例输出
将魔方的状态转为数字,然后再用结构体存储,去进行状态变换,然后就是用map来判重并存操作数
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int maxn=1e7+;
using namespace std; struct node
{
int a[][];
bool operator < (const node &ts) const //map需要
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(a[i][j]<ts.a[i][j])
return ;
}
}
return ;
}
bool operator == (const node &ts) const //用于出递归
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(a[i][j]!=ts.a[i][j])
return ;
}
}
return ;
}
void print()
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
printf(j==?"%d\n":"%d",a[i][j]);
}
}
}
int tonum()//返回一个代表魔方状态的int
{
int res=;
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
res=res*+a[i][j];
}
}
return res;
}
};
node last; node rotate(node u,int num,int op)//获取魔方的下一个状态
{
node res=u;
if(op==-)//右移
{
swap(res.a[num][],res.a[num][]);
swap(res.a[num][],res.a[num][]);
}
else if(op==)//左移
{
swap(res.a[num][],res.a[num][]);
swap(res.a[num][],res.a[num][]);
}
else if(op==-)//上移
{
swap(res.a[][num],res.a[][num]);
swap(res.a[][num],res.a[][num]);
}
else if(op==)//下移
{
swap(res.a[][num],res.a[][num]);
swap(res.a[][num],res.a[][num]);
}
return res;
} void BFS(node first)
{
queue<node> qe;
map<int,int> mp;//判断某一状态是否出现过,并且记录操作数
qe.push(first);
mp[first.tonum()]=;
while(!qe.empty())
{
node t=qe.front();
qe.pop();
int tt=t.tonum();
if(t==last)
{
printf("%d\n",mp[t.tonum()]);
return ;
}
node to;
for(int i=;i<=;i++)
{
to=rotate(t,i,-);
if(!mp.count(to.tonum()))
{
mp[to.tonum()]=mp[tt]+;
qe.push(to);
}
to=rotate(t,i,);
if(!mp.count(to.tonum()))
{
mp[to.tonum()]=mp[tt]+;
qe.push(to);
}
to=rotate(t,i,-);
if(!mp.count(to.tonum()))
{
mp[to.tonum()]=mp[tt]+;
qe.push(to);
}
to=rotate(t,i,);
if(!mp.count(to.tonum()))
{
mp[to.tonum()]=mp[tt]+;
qe.push(to);
}
}
}
printf("-1\n");//不能成功
} int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
last.a[i][j]=(i-)*+j;
}
}
node first;
for(int i=;i<=;i++)
{
int n;
scanf("%d",&n);
first.a[i][]=n%;
first.a[i][]=(n/)%;
first.a[i][]=n/;
}
BFS(first); return ;
}
-
三阶平面魔方(BFS)的更多相关文章
- 任意阶幻方(魔方矩阵)C语言实现
魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...
- magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏
魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史 魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...
- magic矩阵
魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史 魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...
- ZJNU 1196 - 三阶魔方【模拟题】——高级
大模拟,空想很容易把面和面之间的关系搞混 所以这时候需要自己找一个正方体(实在不行长方体代替)跟着图把每个面正方向标出来 然后模拟6种操作分别会对哪些块进行操作 对于储存数据的想法是,对输入输出进行分 ...
- 【ACM】魔方十一题
0. 前言打了两年的百度之星,都没进决赛.我最大的感受就是还是太弱,总结起来就是:人弱就要多做题,人傻就要多做题.题目还是按照分类做可能效果比较好,因此,就有了做几个系列的计划.这是系列中的第一个,解 ...
- css3之3D魔方动画(小白版)
在这里分享一下3D魔方动画,html5+CSS3即可完成~无图无真相,先上效果图 第一步非常简单,就是先将魔方的结构画出来.大家都玩过魔方,知道魔方是一个有六个面的正方体.这里我们先写一个大的di ...
- 程设大作业xjb写——魔方复原
鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...
- EX的魔方
https://www.luogu.org/problem/show?pid=2007 题目背景 常神牛从来没接触过魔方,所以他要借助计算机来玩.即使是这样,他还是很菜. 题目描述 常神牛家的魔方都是 ...
- 用DirectX实现魔方(一)
关于魔方 魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal ...
随机推荐
- 小程序跳坑之JSON字符串转换JSON对象
常见的JSON字符串转换有很多,这里只讲我遇到过的小程序中用到的转换. 通常我们在小程序中用到的地方是,请求一个数据表或者请求一个接口,拿到了一堆数据,里面包含有各种字段数组,头像,图片,详情,地址, ...
- NOIP2016天天爱跑步解题思路
算法:LCA,树上差分+(乱搞) 如果有写错的地方请大佬更正 对于100%数据: u表示起点,v表示终点 对于一条u到v的路径,先讨论LCA!=u&&LCA!=v的情况: 分为u到LC ...
- css怎么让图片垂直左右居中?(外层div是浮动且按照百分比排列)
一.原始的居中方法是把div换成table <div style="width: 500px; height: 200px; border: solid 1px red; text-a ...
- golang打包
golang打包windows很简单直接go bulid xx.go 会有一个.exe文件 直接运行这个文件就行 golang打包linux服务器 SET CGO_ENABLED=0 SET GOOS ...
- 【转】selenium技巧 - 通过js来控制滚动条,通过xpath定位最上层的div层
http://blog.csdn.net/iceryan/article/details/8162703 业务流程: 1.打开此网页 http://nanjing.xiaomishu.com/sh ...
- TypeScript 文件引入 Html (ts import html webpack)
我们的目标是把html引入ts文件,webpack打包时就能把html打进js文件,减少文件加载啦 1 安装 text-loader npm install text-loader --save-de ...
- 深入理解class
一, class和自定义类型的区别: 1,类声明不会被提升. 2,类声明的代码自动运行在严格模式. 3,类的所有方法都是不可枚举的,而自定的方法必须使用Object.defineProperty来设置 ...
- VM15上安装macOS操作系统
(该篇博客已经成功安装上Xcode,放心下载) 因为要开学了,需要学习mac操作系统,自己没有苹果电脑只能虚拟机上下载喽 我在电脑上安装的VM15虚拟机,不会安装的可以来这里下载软件VM15虚拟机 ...
- QF中间件
QF中间件使用说明 QF中间件是在2020年春节期间出现新型冠状病毒感染的肺炎疫情不敢外出,闲来无事编写的.编程是业余爱好,平时编程只会拖控件,中间件可能存在未知Bug,这个版本也只 ...
- 干货分享:Essay Introduction的正确打开方式
其实在学术essay写作过程中,很多留学生经常不知道如何写introduction,所以有些开头的模板句就出现了,比如,With the development of society/With the ...