四轴斜转魔方

news2025/7/5 19:32:45

目录

四轴斜转魔方

1,魔方三要素

 2,公式推导

(1)调整8个角块位置

(2)调整6个中心块位置

(3)调整角块方向


四轴斜转魔方

1,魔方三要素

(1)组成部件

8个角块和6个中心块

 把8个角块编号12345678,分别对应上层的左上、右上、左下、右下以及下层的。

(2)可执行操作

斜转魔方既可以理解成四轴三阶魔方,也可以理解成八轴三阶魔方。

如果认为是8种操作的话,那么可以分成四组,任意一组的2个操作各执行1次或2次加起来都相当于魔方整体旋转。

按照4种操作理解的话,每种操作都会改变3个角块的位置,另外5个角块位置不变,这4个操作影响的3个角块分别是:167、258、358、467

(3)目标态

(3.1)形状

任意一次操作之后,魔方都是正方体,最后也自然是正方体。

(3.2)颜色

8个角块可以唯一确定6个面的位置关系。

 2,公式推导

(1)调整8个角块位置

先调整4个角块的位置,此时可能出现的情况,可以用bfs算一下:

string f1(string s)
{
	char c = s[3];
	s[3] = s[6], s[6] = s[5], s[5] = c;
	return s;
}
string f2(string s)
{
	char c = s[2];
	s[2] = s[4], s[4] = s[7], s[7] = c;
	return s;
}
string f3(string s)
{
	char c = s[0];
	s[0] = s[6], s[6] = s[5], s[5] = c;
	return s;
}
string f4(string s)
{
	char c = s[1];
	s[1] = s[4], s[4] = s[7], s[7] = c;
	return s;
}

void bfs()
{
	string s = "12345678";
	queue<string>q;
	q.push(s);
	map<string, int>m;
	m[s] = 1;
	while (!q.empty())
	{
		string str = q.front();
		q.pop();
		string s = f1(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f2(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f3(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f4(str);
		if (!m[s])m[s] = 1, q.push(s);
	}
	for (auto mi : m) {
		bool flag = true;
		for (int i = 0; i < 4; i++)if (mi.first[i]>'4')flag=false;
		if(flag)cout << mi.first << endl;
	}
}

输出:

12345678
13248675
42315768
43218765

去掉对称性结果,只有13248675一种情况需要调整位置,只需要朴素的三次操作即可。

(2)调整6个中心块位置

以8、5、3为轴顺时针各一次,8个角块的位置不变,左下中心块互换,另外4个中心块轮换。

为了方便,我们把这个叫做853操作。

把6个中心块编号为1上2下3前4后5左6右,则853操作对中心块的位置影响是123456->451623

另外3个操作(674、582、761)的影响依次是532641、365142、645213

于是我们可以就可以推导中心块调整位置的公式:

string f1(string s)
{
	char c = s[2];
	s[2] = s[5], s[5] = c;
	c = s[1];
	s[1] = s[4], s[4] = s[6], s[6] = s[3], s[3] = c;
	return s;
}
string f2(string s)
{
	char c = s[2];
	s[2] = s[3], s[3] = c;
	c = s[1];
	s[1] = s[5], s[5] = s[4], s[4] = s[6], s[6] = c;
	return s;
}
string f3(string s)
{
	char c = s[2];
	s[2] = s[6], s[6] = c;
	c = s[1];
	s[1] = s[3], s[3] = s[5], s[5] = s[4], s[4] = c;
	return s;
}
string f4(string s)
{
	char c = s[2];
	s[2] = s[4], s[4] = c;
	c = s[1];
	s[1] = s[6], s[6] = s[3], s[3] = s[5], s[5] = c;
	return s;
}

void bfs()
{
	string s = " 123456";
	queue<string>q;
	q.push(s);
	map<string, int>m;
	m[s] = 1;
	while (!q.empty())
	{
		string str = q.front();
		q.pop();
		string s = f1(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f2(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f3(str);
		if (!m[s])m[s] = 1, q.push(s);
		s = f4(str);
		if (!m[s])m[s] = 1, q.push(s);
	}
	for (auto mi : m) {
		int x = 0;
		for (int i = 0; i < 7; i++)if (mi.first[i]==s[i])x++;
		if(x>=4)cout << mi.first << endl;
	}
}

输出:

 123456
 123564
 123645
 124536
 124653
 125346
 125463
 126354
 126435
 134256
 135426
 136452
 142356
 143526
 143652
 152436
 153246
 153462
 162453
 163254
 163425
 231456
 243156
 253416
 263451
 312456
 324156
 325416
 326451
 413256
 421356
 423516
 423651
 513426
 521436
 523146
 523461
 613452
 621453
 623154
 623415

理论上任选一个都可以作为基础公式模式。

为了方便,我们选143526作为公式模式。

代码略改一下,求出123456到143526的变换路径:

void bfs()
{
	string s = " 123456";
	queue<string>q;
	q.push(s);
	map<string, int>m;
	map<string, string>p;
	map<string, int>p2;
	m[s] = 1;
	while (!q.empty())
	{
		string str = q.front();
		q.pop();
		string s = f1(str);
		if (!m[s])m[s] = 1, q.push(s), p[s] = str, p2[s] = 1;
		s = f2(str);
		if (!m[s])m[s] = 1, q.push(s), p[s] = str, p2[s] = 2;
		s = f3(str);
		if (!m[s])m[s] = 1, q.push(s), p[s] = str, p2[s] = 3;
		s = f4(str);
		if (!m[s])m[s] = 1, q.push(s), p[s] = str, p2[s] = 4;
	}
	s = " 143526";
	while (s != " 123456") {
		cout << s<<"  "<<p2[s] << "  ";
		s = p[s];
	}
	cout << s << endl;
}

输出:

 143526  2   634215  1   415632  3   624351  1   451623  1   123456

也就是说,从123456,依次执行853、853、582、853 、674操作,共15次操作,即可变成143526,即245三个色块的轮换。

有此公式,即可完成所有中心块的归位。

亲测有效:

 

(3)调整角块方向

把853操作直接重复4遍,则所有块位置不变,角块中24方向不变,其他6个角块都顺时针转一次。

我们把它理解成对8个角块顺时针旋转,并对24逆时针旋转,把这个操作叫做24操作。

2个12操作+1个24操作,我们就得到一个只改变1和4不改变另外6个角块的操作(1顺时针旋转4逆时针旋转)。

有了这个操作,显然可以把除了2个相邻角块之外的所有角块方向复原。

最后,有没有可能只有2个角块方向不对呢?我不确定,应该没有吧。

如果没有,那么所有的情况都解决了。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel实现服务降级并与api解耦

Sentinel怎样实现熔断降级 熔断降级介绍 sentinel支持服务的熔断降级 熔断类似于保险丝&#xff0c;在超出了阈值的情况下&#xff0c;在一定的时间内不会执行业务逻辑&#xff0c;直接执行服务降级的方法。服务降级利用本地fallback方法&#xff0c;返回一个有好的提示给客…

Scala配置和Spark配置以及Scala一些函数的用法(附带词频统计实例)

文章目录配置Spark配置Scala生成RDDfilter过滤器map方法flatMap方法reduceByKeyspark下wordcount程序参考先给出spark和Scala的下载地址&#xff0c;这是我用的版本https://pan.baidu.com/s/1rcG1xckk3zmp9BLmf74hsg?pwd1111也可以自己去官网下载。配置Spark 解压文件到softw…

public,private,protected,default的区别

public public&#xff08;公开&#xff09;表示任何人都可以访问和使用该元素&#xff1b; public class Test {public static void main(String[] args) {Person pnew Person();System.out.println(p.name);//输出小明} } class Person{public String name"小明"…

Go 开发环境安装之Goland和vscode

一、前言 Go语言或将成为新的主力开发语言&#xff0c;Go是google开发的一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言&#xff0c;所以我们有必要学习并掌握它。第一件事情&#xff0c;就是把环境搭建起来&#xff0c;大家可以跟着步骤一起将Go语…

【计算机网络】数据链路层:点对点协议PPP

对于点对点链路&#xff0c;目前使用最为广泛的数据链路层协议是点对点协议PPP。 简单&#xff08;首要要求&#xff09; 封装成帧&#xff1a;保证数据传输的透明性 多种网络层协议&#xff1a;能够在同一条物理链路上同时支持多种网络层协议。 多种类型链路&#xff1a;能…

2020牛客暑期多校训练营(第十场)I.Tournament(构造/贪心)

题目 t(1<t<30)组样例&#xff0c;n(2<n<300)个球队&#xff0c; 每个球队都和其它所有球队比一场&#xff0c;一共有场比赛。 每天只比一场比赛&#xff0c;每个球队会在其第一场比赛开始时到&#xff0c;最后一场比赛后走。 安排一个日程表&#xff0c;使所有…

Linux多线程C++版(五) 线程同步和线程互斥

目录1.线程同步和线程互斥2.线程互斥案例---ATM取钱--没有使用互斥锁3.线程互斥----互斥锁(互斥量)4.互斥锁创建和销毁5.互斥锁上锁和解锁6.线程互斥案例---ATM取钱--使用互斥锁7.互斥锁属性创建和销毁8.互斥锁属性之一---进程共享属性操作9.互斥锁属性之一----互斥锁类型操作1…

[附源码]计算机毕业设计JAVA人口老龄化社区服务与管理平台

[附源码]计算机毕业设计JAVA人口老龄化社区服务与管理平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

Apollo 应用与源码分析:Monitor监控 - Monitor_managerecurrent_runner分析

目录 monitor_manager 分析 结构分析 单例模式宏定义 描述现在的系统状态 HMI上显示的状态信息 仿真判断状态 判断是不是自动驾驶状态 日志缓存 当前node 所有monitor 的reader 管理map 开启一次监控 start frame分析 end frame分析 recurrent_runner 分析 结构…

计算机键盘用途及快捷键

用途&#xff1a; 电脑键盘上有那么多按键&#xff0c;到底都有什么作用呢&#xff1f; 几个重要的按键&#xff0c;一起来了解一下吧。 最上面一排&#xff1a; F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 1、键盘中间区域的所有输入按键。 一共是26个英文字母…

初次接触氛围系统架构,聊聊我这三个月的理解

本文主要介绍了作者对于氛围中心的业务理解。从氛围的概念出发&#xff0c;阐述了氛围系统的必要性&#xff0c;然后展示了配置端的数据写入、调用端的配置读取等氛围系统的架构细节&#xff0c;最后作者提出了一些对于氛围中心未来的想法和思考。概述▐ 氛围的概念氛围是能够…

V5.1.1,新版发布|软件安全大于一切

主要内容&#xff1a;本次版本除了常规的BUG修复&#xff0c;最重要的是对系统安全全面升级&#xff0c;加强了系统安全检测机制&#xff0c;更新了Thinkphp核心版本&#xff0c;强化了密码等安全。 本次新增了在线用户&#xff0c;支持在线用户下强制下线处理。 本次新增的超级…

java项目-第161期ssm弹幕视频网站系统_ssm毕业设计_计算机毕业设计

java项目-第161期ssm弹幕视频网站系统_ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm弹幕视频网站》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台视频信息、商品信息&#xff0c;并且可以进行购买。 管理员角色拥有的权限最…

基于jquery 实现导航条高亮显示的两种方法

本篇文章是基于jquery实现导航菜单高亮显示&#xff0c;当点击不同导航菜单实现当前点击的菜单是高亮的&#xff0c;有需要的朋友可以关注下本文 实现原理&#xff1a;当选中当前元素时&#xff0c;给当前元素添加样式&#xff0c;同级元素移除样式。 点击不同的导航菜单实现…

基于SpringBoot的校园志愿者管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;HTML、Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Java23种设计模式之第三弹-工厂模式

说起工厂&#xff0c;我们第一反应是制作什么东西的吧~。在现实生活中&#xff0c;工厂 &#xff0c; 就是用于生成一些特定事物的厂商。 回到我们此处说的工厂模式上&#xff0c;什么是工厂模式呢 &#xff0c; 顾名思义&#xff0c;就是生成我们的对象的类就会称成为工厂。 …

机器学习模型与backtrader框架整合

原创文章第116篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情似乎还没有到拐点&#xff0c;但这三天结束后应该会到来。 今天重点说说&#xff0c;机器学习模型整合到我们的回测框架中&#xff0c;并与backtrader连接起来回测…

【Python模块】logging 日志模块

当入门一门语言时&#xff0c;最简单最直观的打印日志信息方式就是使用 print() 函数了&#xff0c;而这毕竟是自己练习和测试才会这样做。当参与项目时一定会去使用日志模块实现日志信息的打印和记录&#xff0c;而 Python 提供了内置的日志模块 logging&#xff0c;有必要深入…

解决每次打开pycharm都特别慢的几个方法

Python编写时&#xff0c;通常都会用vscode和pycharm两个工具&#xff0c;使用过程中&#xff0c;发现每次打开pycharm都特别特别慢&#xff0c;有时候要等十来分钟。相信大家可能都有遇到一样的情况&#xff0c;所以分享我自己的解决方法给大家参考。 1&#xff0c;每次需要关…

[附源码]java毕业设计置地房屋租赁信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…