一个简单的控制台Rubik';C中的s立方体(无需求解,仅需设计)

一个简单的控制台Rubik';C中的s立方体(无需求解,仅需设计),c,C,所以,作为一个初学者,这个程序让我感到偏头痛。当然,我不是要求任何完整的代码,我想了解逻辑和我的选择 在大学里,我们已经(或将要)讨论的C编程主题不超过动态数组。我们可以使用结构、函数、数组、指针,但 >类< /强>,因为这是C,而不是C++ +< /P> 我擅长解决问题,但不擅长拼图。我尝试的是用6个整数(表示边)创建一个立方体结构,然后创建一个立方体数组 我可以做的另一件事是制作一个[6][3][3]数组,但我认为这会使它太复杂吗?总结一下我的问题 要求 控制台应用程序 没有花哨的图形或任

所以,作为一个初学者,这个程序让我感到偏头痛。当然,我不是要求任何完整的代码,我想了解逻辑和我的选择

在大学里,我们已经(或将要)讨论的C编程主题不超过动态数组。我们可以使用结构、函数、数组、指针,但<强> >类< /强>,因为这是C,而不是C++ +< /P> 我擅长解决问题,但不擅长拼图。我尝试的是用6个整数(表示边)创建一个立方体结构,然后创建一个立方体数组

我可以做的另一件事是制作一个[6][3][3]数组,但我认为这会使它太复杂吗?总结一下我的问题

要求
  • 控制台应用程序
  • 没有花哨的图形或任何东西
  • 无解
  • 只是一个工作立方体
  • 可以初始化为用户输入
级别:业余

这是正确的方法吗?你认为我应该如何旋转一条线?同样,不需要代码,如果您能解释主要逻辑,以及我应该如何分解代码,甚至伪代码,那就太好了

你认为我应该用魔方
rubik[3][3][3]
制作一个完整的立方体,还是像处理
cube-face[3][3]
那样处理人脸

我将添加您需要的任何额外信息以帮助解决我的问题

编辑-其他信息: 这是我的多维数据集数组(这里的编辑器稍微弄乱了缩进):


你可以试着在视觉上表现出来,基本上一个立方体有6个面,每一面有9个小正方形(或者一个9x9数组)


这本书对如何表示一个立方体有一些有趣的想法。

立方体可以用

int tile[6][3][3];
第一个索引是立方体的面

第二个和第三个表示行和列

数组的值是颜色(0-5)


可在立方体上执行的操作是将6个面中的一个面顺时针旋转90°(因此有6个可能的操作)

任何其他lecit动作都可以用上述序列来表示


为了完整性,即使没有人问,解决这个难题的最简单方法是尝试所有可能的动作序列,直到找到解决方案为止。但这将导致内存和处理器的使用效率非常低。由于解决方案通常在20个移动中找到,最坏情况下将导致尝试大约1.0E14个移动


网络上有很多解谜算法…

您描述的任何一个选项都可以完成这项工作。你如何用逻辑来打破它实际上取决于什么对你最有意义。可能有帮助的是写下一个列表,列出rubix多维数据集具有哪些功能,然后重新排列,直到找到表示对象每个部分的方法为止。你的阵列想法是一个很好的开始

。。。[6] [3][3]数组,但我认为这会使它太复杂


我认为这很有意义,实际上是解决问题的一个相当简单的方法。我的建议是顺其自然,试一试

//代码太长,因此它由两部分组成

1部分 这应该有效:(我知道它很长,没有太多评论,但主要的想法是有占位符,它们可以持有字符u-up、f-front、d-down、b-back、l-left和r-right。它们可以用move方法移动。 有两种移动方法,一种是侧移,另一种是面移,然后用画法画出所有的东西

static void Move(ref char b0, ref char b1, ref char b2, ref char b3, ref char b4, ref char b5, ref char b6, ref char b7, ref char b8, ref char b9, ref char b10, ref char b11)
        {
            char m = b11;
            b11 = b10;
            b10 = b9;
            b9 = b8;
            b8 = b7;
            b7 = b6;
            b6 = b5;
            b5 = b4;
            b4 = b3;
            b3 = b2;
            b2 = b1;
            b1 = b0;
            b0 = m;
        }
        static void MoveSide(ref char b0, ref char b1, ref char b2, ref char b3)
        {
            char m = b3;
            b3 = b2;
            b2 = b1;
            b1 = b0;
            b0 = m;
        }
        static void Color(char p)
        {
            switch (p)
            {
                case 'u':
                Console.ForegroundColor = ConsoleColor.White;
                break;
                case 'f':
                Console.ForegroundColor = ConsoleColor.Green;
                break;
                case 'd':
                Console.ForegroundColor = ConsoleColor.Yellow;
                break;
                case 'b':
                Console.ForegroundColor = ConsoleColor.Blue;
                break;
                case 'l':
                Console.ForegroundColor = ConsoleColor.Magenta;
                break;
                case 'r':
                Console.ForegroundColor = ConsoleColor.Red;
                break;
            }
        }
#第二部分


将来,如果你有一个C问题,不想C++答案,就省略C++标签。但是,注意“逻辑上最简单”!=“有效”。将导致许多移动序列,导致之前已看到的状态,因此将生成大量循环序列,除非您记住已看到的每个状态并在每次移动中进行比较,这将需要大量内存(大约20个不同的可能状态)…如前所述,不需要解立方体,只需要让它像应该的那样运动:)@twalberg是的,我同意。我会更新我的答案
static void Move(ref char b0, ref char b1, ref char b2, ref char b3, ref char b4, ref char b5, ref char b6, ref char b7, ref char b8, ref char b9, ref char b10, ref char b11)
        {
            char m = b11;
            b11 = b10;
            b10 = b9;
            b9 = b8;
            b8 = b7;
            b7 = b6;
            b6 = b5;
            b5 = b4;
            b4 = b3;
            b3 = b2;
            b2 = b1;
            b1 = b0;
            b0 = m;
        }
        static void MoveSide(ref char b0, ref char b1, ref char b2, ref char b3)
        {
            char m = b3;
            b3 = b2;
            b2 = b1;
            b1 = b0;
            b0 = m;
        }
        static void Color(char p)
        {
            switch (p)
            {
                case 'u':
                Console.ForegroundColor = ConsoleColor.White;
                break;
                case 'f':
                Console.ForegroundColor = ConsoleColor.Green;
                break;
                case 'd':
                Console.ForegroundColor = ConsoleColor.Yellow;
                break;
                case 'b':
                Console.ForegroundColor = ConsoleColor.Blue;
                break;
                case 'l':
                Console.ForegroundColor = ConsoleColor.Magenta;
                break;
                case 'r':
                Console.ForegroundColor = ConsoleColor.Red;
                break;
            }
        }
static void Move(ref char b0, ref char b1, ref char b2, ref char b3, ref char b4, ref char b5, ref char b6, ref char b7, ref char b8, ref char b9, ref char b10, ref char b11)
            {
                char m = b11;
                b11 = b10;
                b10 = b9;
                b9 = b8;
                b8 = b7;
                b7 = b6;
                b6 = b5;
                b5 = b4;
                b4 = b3;
                b3 = b2;
                b2 = b1;
                b1 = b0;
                b0 = m;
            }
            static void MoveSide(ref char b0, ref char b1, ref char b2, ref char b3)
            {
                char m = b3;
                b3 = b2;
                b2 = b1;
                b1 = b0;
                b0 = m;
            }
            static void Color(char p)
            {
                switch (p)
                {
                    case 'u':
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
                    case 'f':
                    Console.ForegroundColor = ConsoleColor.Green;
                    break;
                    case 'd':
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    break;
                    case 'b':
                    Console.ForegroundColor = ConsoleColor.Blue;
                    break;
                    case 'l':
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    break;
                    case 'r':
                    Console.ForegroundColor = ConsoleColor.Red;
                    break;
                }
            }