-1

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

在大学里,我们已经涵盖(或将涵盖)的 C 编程主题不超过动态数组。我们可以使用结构、函数、数组、指针,但不能使用类,因为这是 C,而不是 C++。

我擅长解决方案,但不擅长解谜。我试过的是用 6 个整数(代表边)制作一个立方体结构,然后制作一个cube数组。

我可以做的另一件事是制作一个 [6][3][3] 数组,但我认为这会使其过于复杂?总结一下我在问什么,

要求

  • 控制台应用程序
  • 没有花哨的图形或任何东西
  • 没有解决方案
  • 只是一个工作立方体
  • 可以初始化为用户输入

级别:业余

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

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

我会添加您需要的任何额外信息来帮助解决我的问题。

编辑 - 附加信息:这是我的立方体数组(这里的编辑器把缩进弄乱了一点):

int cube[6][3][3] = {{{1,1,1},{1,1,1},{1,1,1}}, 
            {{2,2,2},{2,2,2},{2,2,2}}, 
            {{3,3,3},{3,3,3},{3,3,3}},
            {{4,4,4},{4,4,4},{4,4,4}},
            {{5,5,5},{5,5,5},{5,5,5}},
            {{6,6,6},{6,6,6},{6,6,6}}  };
4

4 回答 4

1

您所描述的任何一个选项都可以完成这项工作。你如何用逻辑分解它真的取决于什么对你最有意义。可能有帮助的是写下一个列表,列出rubix 立方体具有的功能并重新排列,直到您有办法表示对象的每个部分。你的阵列想法是一个很好的开始。

... [6][3][3] 数组,但我认为这会使其过于复杂?

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

于 2013-11-11T18:42:30.343 回答
1

一个立方体可以表示为

int tile[6][3][3];

第一个索引是立方体的面

第二个和第三个分别代表行和列

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


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

任何其他合理的动作都可以由上述序列表示。


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

网络上有很多解谜算法......

于 2013-11-11T18:28:17.327 回答
0

你可以试着从视觉上看,基本上一个立方体有 6 个面,每边有 9 个小方块(或 9x9 阵列)。

本书有一些关于如何代表一个有趣的想法。

于 2013-11-11T18:27:37.897 回答
-1

//代码太长,分两部分。

1 部分

这应该可行:(我知道它很长并且没有太多评论,但主要思想是有占位符可以保存字符 u-up、f-front、d-down、b-back、l-left 和r-right. 他们可以用 move 方法移动。有 yhe side 和 face 两种 move 方法。之后一切都用 draw 方法绘制。

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;
            }
        }

#第2部分

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;
                }
            }
于 2016-10-17T20:00:18.537 回答