题目:
You have four colored cubes. Each side of each cube is a single color,
and there are four colors: blue (B), red (R), green (G) and yellow (Y)
Describing the six faces as front, back, left, right, top, bottom, the
cube colors are:
Cube Front Back Left Right Top Bottom
1 R B G Y B Y
2 R G G Y B B
3 Y B R G Y R
4 Y G B R R R
The objective is to find ways to stack the four cubes as a vertical
column so that each side of the column is showing all four colors.
Use the language of your choice to write a program to find all
successful permutations.
我的解决方案:
----- 建立模型 ------
首先将四个CUBE进行编号,
1 代表 第一个
2 代表 第二个
3 代表 第三个
4 代表 第四个
对这四个CUBE进行编号后,对颜色进行编号,
1 代表 blue
2 代表 red
3 代表 green
4 代表 yellow
对这四个cube的六个面进行编号
1 代表 front
2 代表 back
3 代表 left
4 代表 right
5 代表 top
6 代表 bottom
对这某一个cube的某一个面处于上面时,将其的四个方向进行编号为1,2,3,4
----------------------------------
解决方案一
命名:完全遍历法
解决根本思想:正确地结果是四种颜色的结果值在一起,相加得的结果是10
1.首先获得一个根据根据顶部获得四周的颜色(以下是方法的命名,最后可以获得一个颜色的值)(可以采用枚举法)
//参数:通过cube的编号(cubeNum)\cube的在上面的一个面(cubeTopColor)\cube的方向(cubeDirection)值来获得颜色值
//返回:颜色值
public int GetColorByCubeNumAndCubeDiredtion(int cubeNum,int cubeTopColor,int cubeDirection);
2.通过颜色遍历其中的一种可能(cube自顶向下顺序是1,2,3,4)
帮助函数
//参数:四个CUBE的颜色值
//返回:这四个CUBE的值的和是否为10(为10返回true,不为10返回false)
public bool CheckRightResult(int cc1,int cc2,int cc3,int cc4);
//算法执行效率的解决方案(可以定义为解决方案二)
----------------------------------------------
命名:遍历排除法
解决根本思想:判断颜色是否重复,直接判断
第一个解决方案的完全遍历,执行效率不高,所以用这个来解决
这个是为了是判断的效率更高来使用的,之前的已经可以实现,但是,现在这个可以减少判断的次数
实现思路是,先获得第一个cube的颜色之后,将其放入一个数组中,然后,再获得下二个cube的颜色,如果true,则进行下一个循环,如果false,则继续
当然最后的CheckRightResult函数,要通过这个函数来代替,最后,为false,则记录
//判断再现在已经有的颜色是否有现在的颜色
//如果有,则进行下一个循环,如果没有,继续
public bool CheckRightColor(int cc);
----------------------------------------------
主函数
public void main()
{
int 第一个颜色的值;
int 第二个颜色的值;
int 第三个颜色的值;
int 第四个颜色的值;
//开始遍历cube的六个面
for(int c1 = 0; c1 < 6; c1++)
{
//开始遍历cube的四个方向,
for(int d1 = 0;d1 < 4; d1++)
{
第一个cube的颜色值cc1 = GetColorByCubeNumAndCubeDiredtion(1,c1,d1);
//开始遍历cube的六个面
for(int c2 = 0; c2 < 6; c2++)
{
//开始遍历cube的四个方向,
for(int d2 = 0;d2 < 4; d2++)
{
第二个cube的颜色值cc2 = GetColorByCubeNumAndCubeDiredtion(1,c2,d2);
//开始遍历cube的六个面
for(int c3 = 0; c3 < 6; c3++)
{
//开始遍历cube的四个方向,
for(int d3 = 0;d3 < 4; d3++)
{
第三个cube的颜色值cc3 = GetColorByCubeNumAndCubeDiredtion(1,c3,d3);
//开始遍历cube的六个面
for(int c4 = 0; c4 < 6; c4++)
{
//开始遍历cube的四个方向,
for(int d4 = 0;d4 < 4; d4++)
{
第四个cube的颜色值cc4 = GetColorByCubeNumAndCubeDiredtion(1,c4,d4);
if(CheckRightResult(cc1,cc2,cc3,cc4))
{
//为真放入一个stack里面
//这种情况的数据包括1,cc1,2,cc2,3,cc3,4,cc4
s.add(这种情况的数据);
}
}
}//第四个结束
}
}//第三个结束
}
}//第二个结束
}//第一个结束
}
}
3.然后轮换(编写一个轮换函数即可)一共轮换的时候,是4*3*2*1种可能
//将获得的基础stack里面的数据情况cc,进行轮换
//返回一种情况的stack
public stack ChangeCCC(int cc1,int cc2,int cc3,int cc4)
4.输出stack
将各种情况的stack进行输出
//最后说一句:“太早了,再睡个回笼觉”。