三阶平面魔方(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 ...
随机推荐
- eclipse启动tomcat访问localhost:8080报404
直接双击tomcat\bin目录下面的startup.bat启动 是没问题 的 但是eclipse启动tomcat访问localhost:8080报404 解决方案如下: 双击红色圈里面的tomcat ...
- cf 498 B. Name That Tune
不会不会,,,%%http://hzwer.com/5813.html #include<cstdio> #include<iostream> #include<algo ...
- C#验证码 使用GDI绘制验证码
首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...
- 033-PHP取1-100的随机数
<?php // 生成一个随机数 // 从1到100中取得随机数 for ($index = 0; $index < 100; $index++) { $number = (rand() ...
- spring boot集成mybatis(1)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- cvthreshold 的运用
什么是阈值? 最简单的图像分割的方法. 应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体).这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割 ...
- 18 react react-redux 的编写 TodoList
1. 安装 react-redux yarn add react-redux 2. react-redux 编写 TodoList 使所有子组件 都能使用 store #index.js import ...
- java切换jdk版本
目的:将jdk1.7切换为jdk1.6 1.原本安装了jdk1.7,环境变量也是配置的1.7相关路径,在cmd下输入[java -version]后,显示 [ C:\Users\Administrat ...
- WindowsForm ComboBoxList 下拉框带复选框 可以动态添加
先来张效果图: 1.这里需要对控件进行重写,详细内容如下,对此不感兴趣的可以直接跳过这步,下载本人生成的dll,直接看第二小结,下载链接https://pan.baidu.com/s/1gfzrK5t ...
- Codeforces 437D 贪心+并查集
这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij ...