有一个  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)的更多相关文章

  1. 任意阶幻方(魔方矩阵)C语言实现

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  2. magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏

    魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史       魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...

  3. magic矩阵

    魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史       魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...

  4. ZJNU 1196 - 三阶魔方【模拟题】——高级

    大模拟,空想很容易把面和面之间的关系搞混 所以这时候需要自己找一个正方体(实在不行长方体代替)跟着图把每个面正方向标出来 然后模拟6种操作分别会对哪些块进行操作 对于储存数据的想法是,对输入输出进行分 ...

  5. 【ACM】魔方十一题

    0. 前言打了两年的百度之星,都没进决赛.我最大的感受就是还是太弱,总结起来就是:人弱就要多做题,人傻就要多做题.题目还是按照分类做可能效果比较好,因此,就有了做几个系列的计划.这是系列中的第一个,解 ...

  6. css3之3D魔方动画(小白版)

      在这里分享一下3D魔方动画,html5+CSS3即可完成~无图无真相,先上效果图 第一步非常简单,就是先将魔方的结构画出来.大家都玩过魔方,知道魔方是一个有六个面的正方体.这里我们先写一个大的di ...

  7. 程设大作业xjb写——魔方复原

    鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...

  8. EX的魔方

    https://www.luogu.org/problem/show?pid=2007 题目背景 常神牛从来没接触过魔方,所以他要借助计算机来玩.即使是这样,他还是很菜. 题目描述 常神牛家的魔方都是 ...

  9. 用DirectX实现魔方(一)

    关于魔方 魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal ...

随机推荐

  1. tensorflow学习笔记--dataset使用,创建自己的数据集

    数据读入需求 我们在训练模型参数时想要从训练数据集中一次取出一小批数据(比如50条.100条)做梯度下降,不断地分批取出数据直到损失函数基本不再减小并且在训练集上的正确率足够高,取出的n条数据还要是预 ...

  2. Swift Json解析与model互转

    Json的解码与编码操作,这里使用swift自带的类JSONDecoder 和 JSONEncoder 1.基础处理 如果你的 JSON 数据结构和你使用的 Model 对象结构一致的话,那么解析过程 ...

  3. 深度解析Critical Thinking的四个阶段

    关于批判性思维我们一直都在讨论学习,但是小编相信没有几个留学生敢说自己有Critical Thinking,但它又是essay写作中必须存在的.那么批判性思维需要怎么培养呢?今天小编就给同学们分析一下 ...

  4. 实验吧-密码学-Decode、困在栅栏里的凯撒

    Decode 这是一个多重加密. 0x253464253534253435253335253433253661253435253737253464253531253666253738253464253 ...

  5. 逆向--C函数和汇编

    C函数和汇编 C代码 (编译工具gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609平台ubuntu i386 32位) int bar(int c ...

  6. SciKit-Learn 使用matplotlib可视化数据

    章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Learn 可视化数据:主成分分析(P ...

  7. selenium2Library无法启动chrome

    使用其他浏览器都没有影响,唯独chrome启动不起来,去掉IE-连接-局域网设置-自动检测设置就OK了

  8. P5091 【模板】欧拉定理(欧拉降幂)

    P5091 [模板]欧拉定理 以上3张图是从这篇 博客 里盗的,讲的比较清楚. #include<bits/stdc++.h> using namespace std; typedef l ...

  9. C语言拾遗——sscanf

    今天写题用到了sscanf,怕忘赶紧记录一下 去百度了一下这玩意的函数原型好像是长这样的,微软上扣下来的  int sscanf( const char *buffer, const char *fo ...

  10. App_显示图表内容

    今天在之前记账本的基础上增加了图标的显示功能,在本次课程中它以折线图为例讲述.但是课程中给出了多有图的代码案例. https://github.com/lecho/hellocharts-androi ...