我的程序生活

爱程序,爱生活

导航

遇到一个面试题和我的解决方案,大家看下!!!

Posted on 2006-11-22 12:06  Mark Hu  阅读(1119)  评论(2编辑  收藏  举报

题目:
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进行输出


//最后说一句:“太早了,再睡个回笼觉”。