13,100
社区成员
发帖
与我相关
我的任务
分享
bool CompareCube(LPCUBE_UNION cube,int total/* 立方体的数量*/)
{
//分别对比“柱”的四个立面,是否含有全部颜色样
char color;
for (int i=0;i<4;i++)
{
color=0;
for (int ii=0;ii<total;ii++)
{
switch(cube[ii].color[i])
{
case 'Y':
color|=1;
break;
case 'R':
color|=2;
break;
case 'G':
color|=4;
break;
case 'B':
color|=8;
break;
}
}
if (color!=0xF) return false;
}
return true;
}
/********** cube.h start ***********/
typedef struct{
char front; //z 轴面
char back; //z 轴面
char left; //x 轴面
char right; //x 轴面
char top; //y 轴面
char bottom; // y 轴面
}CUBE_STRUCT,*LPCUBE_STRUCT;
typedef union{
char color[7];
CUBE_STRUCT cube;
}CUBE_UNION,*LPCUBE_UNION;
typedef enum
{
UP=0,
DOWN,
LEFT,
RIGHT,
CW,
CCW
}ROTATION_DIRECTION;
//旋转立放体
void RotationCube(CUBE_STRUCT &cube,ROTATION_DIRECTION dir);
//搜索立方体的组合
void SearchCube(LPCUBE_UNION cube,int index,int total=4);
//比较立方体
bool CompareCube(LPCUBE_UNION cube,int total);
extern int Successfully,SearchCount;
/********* cube.h end***************/
/********* cube.cpp start****************/
int Successfully=0,SearchCount=0;
void RotationCube(CUBE_STRUCT &cube,ROTATION_DIRECTION dir /* 旋转方向*/)
{
char tmp;
switch (dir)
{
case UP://将立方体沿x轴向上旋转(左右面固定)
tmp = cube.bottom;
cube.bottom = cube.back;
cube.back = cube.top;
cube.top = cube.front;
cube.front = tmp;
break;
case DOWN://将立方体沿x轴向下旋转(左右面固定)
tmp = cube.bottom;
cube.bottom = cube.front;
cube.front = cube.top;
cube.top = cube.back;
cube.back = tmp;
break;
case LEFT://将立方体沿y轴向下旋转(上下面固定)
tmp = cube.front;
cube.front = cube.right;
cube.right = cube.back;
cube.back = cube.left;
cube.left = tmp;
break;
case RIGHT://将立方体沿y轴向下旋转(上下面固定)
tmp = cube.front;
cube.front = cube.left;
cube.left = cube.back;
cube.back = cube.right;
cube.right = tmp;
break;
case CW://将立方体沿z轴顺时针旋转(前后面固定)
tmp = cube.bottom;
cube.bottom = cube.right;
cube.right = cube.top;
cube.top = cube.left;
cube.left = tmp;
break;
case CCW://将立方体沿z轴逆时针旋转(前后面固定)
tmp = cube.bottom;
cube.bottom = cube.left;
cube.left = cube.top;
cube.top = cube.right;
cube.right = tmp;
break;
}
}
void SearchCube(LPCUBE_UNION cube,int index/* 当前立方体索引*/,int total/* 立方体的数量*/)
{
//以立方体的每个轴面为Y轴,然后绕Y轴旋转一周(四次),对比每次旋转后的颜色。
//因为立方体共有三个轴,加上每个轴可以上下颠倒,所以一共可以旋转 6*4=24次。
for (int i=0;i<6;i++)
{
if (i<=3)
{
//向上旋转立方体总共旋转四次
RotationCube(cube[index].cube,UP);
}
else if (i==4)
{
//顺时针旋转立方体一次
RotationCube(cube[index].cube,CW);
}
else
{
//顺时针旋转立方体两次
RotationCube(cube[index].cube,CW);
RotationCube(cube[index].cube,CW);
}
//如果这是第一个立方体,则不用进行左右旋转,从第二个立方体开始在进行左右旋转。
if (index==0 && total >1)
{
SearchCube(cube,index+1,total);
continue;
}
for (int ii=0;ii<4 ;ii++)
{
RotationCube(cube[index].cube,LEFT);
//如果这是最后一个立方体那么在此对比所有立方体的值。
if (index+1 == total)
{
SearchCount++;
if (CompareCube(cube,total))
{
Successfully++;
}
}
else
{
//不是最后一个立方体,旋转下一个立方体
SearchCube(cube,index+1,total);
}
}
}
RotationCube(cube[index].cube,CW);
}
bool CompareCube(LPCUBE_UNION cube,int total/* 立方体的数量*/)
{
//分别对比“柱”的四个立面,是否颜色一样
char color;
for (int i=0;i<4;i++)
{
color = cube[0].color[i];
for (int ii=1;ii<total;ii++)
{
if (color !=cube[ii].color[i])
return false;
}
}
return true;
}
/********* cube.cpp end****************/
#include <stdio.h>
#include <iostream>
#include "cube.h"
using namespace std;
int main(int argv,char* argc)
{
//初始化立面
CUBE_UNION cube[4] ={
{'R','B','G','Y','B','Y',0},
{'R','G','G','Y','B','B',0},
{'Y','B','R','G','Y','R',0},
{'Y','G','B','R','R','R',0}
};
char key;
SearchCube(cube,0);
cout << "Search Count:"<<SearchCount << " Successfully:" << Successfully;
cin >> key;
return 0;
}