当前位置: 代码迷 >> C# >> 怎的生成随机魔方
  详细解决方案

怎的生成随机魔方

热度:71   发布时间:2016-05-05 04:21:47.0
怎样生成随机魔方?

做了个二维魔方程序,C#写的,不会3维制作就用平面图代替了







每个面都是用一个二维3×3的数组表示的,分别用1到6表示六种颜色,根据实际旋转效果实现了魔方公式中的每一个动作。每个面都是用dgv显示的,不同的值显示不同的颜色,然后让字体的颜色和背景保持一致。



这三个函数分别为 顺时针90度、逆时针90度和旋转180度。
我想知道除了生成随机的旋转公式来生成随机魔方之外,有没有办法直接生成一个随机魔方数组?其中有什么规律?
------解决思路----------------------
6个面,每个面9个方块,你以某个块为起点,组织成一个一维数组,将每个色块循环添加,最后orderby一下
比如
Block[] blocks = new Block[54];
Colors[] colors = {Color.Red,Color.White,Color.Yellow,Color.Orange,Color.Green,Color.Blue};
for(i=0;i<blocks.Length;i++)
{
      Block block = new Block();
      block.Color = colors[i/6];
      block.Index=i;
      blocks[i]=block;
}
var randomArr = blocks.OrderBy(x=>new Guid());

------解决思路----------------------
引用:
Quote: 引用:

6个面,每个面9个方块,你以某个块为起点,组织成一个一维数组,将每个色块循环添加,最后orderby一下
比如
Block[] blocks = new Block[54];
Colors[] colors = {Color.Red,Color.White,Color.Yellow,Color.Orange,Color.Green,Color.Blue};
for(i=0;i<blocks.Length;i++)
{
      Block block = new Block();
      block.Color = colors[i/6];
      block.Index=i;
      blocks[i]=block;
}
var randomArr = blocks.OrderBy(x=>new Guid());

这样有可能得到现实中不可能出现的魔方状态,一是因为中心色块颜色不变,二是以蓝色面(前面)为例,它永远不会和绿色面(后面)相邻。



引用:
6个中心块,这个不能随机
8个角,可以随机
12个边,可以随机


那上面的可以改下啊,6个中心块不能随机,那么数组就只有48,除也就是除8,其它看起来貌似都是可以随机的
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

6个面,每个面9个方块,你以某个块为起点,组织成一个一维数组,将每个色块循环添加,最后orderby一下
比如
Block[] blocks = new Block[54];
Colors[] colors = {Color.Red,Color.White,Color.Yellow,Color.Orange,Color.Green,Color.Blue};
for(i=0;i<blocks.Length;i++)
{
      Block block = new Block();
      block.Color = colors[i/6];
      block.Index=i;
      blocks[i]=block;
}
var randomArr = blocks.OrderBy(x=>new Guid());

这样有可能得到现实中不可能出现的魔方状态,一是因为中心色块颜色不变,二是以蓝色面(前面)为例,它永远不会和绿色面(后面)相邻。



引用:
6个中心块,这个不能随机
8个角,可以随机
12个边,可以随机


那上面的可以改下啊,6个中心块不能随机,那么数组就只有48,除也就是除8,其它看起来貌似都是可以随机的

8个角只能在角上,12个边也只能在边上,哪能全都随机呢。
------解决思路----------------------
每个角是3种颜色相邻,不能乱变。每个边是两种颜色相邻,也不能乱变的,不然除非拆掉魔方重组,是没法解的。
  相关解决方案