您的位置:首页 > 大数据 > 人工智能

算法竞赛入门经典(第2版)习题4-4 骰子涂色 Cube painting UVa 253

2014-08-08 17:37 549 查看
这题用穷举法最合适,每种骰子至多有24种状态,读入数据穷举一下就行了。

1.为了提高效率,可以分别用特征数字100(b)/10(g)/1(r)来表示每个面的颜色,这样两个等价骰子的特征数字之和必然是相等的。如果不相等则直接输出'FALSE'

2.骰子可以沿着x/y/z三个方向旋转,如果两个特征数字相等的骰子对不上,那就旋转吧。

一次ac。

//#define LOCAL
//#define TESTING
#include<stdio.h>
#include<ctype.h>
#include<string.h>

char cube1[7],cube2[7],tempcube[7];
int sum1,sum2;

int code(char color)
{
if(color == 'r') return 1;
else if(color == 'g') return 10;
else if(color == 'b') return 100;
}

int check()
{
for(int i = 1; i <= 6; i++)
{
if(tempcube[i]!=cube2[i]) return i;
}
return 0;
}

void rotatex()
{
char temps;
temps = tempcube[1];
tempcube[1] = tempcube[2];
tempcube[2] = tempcube[6];
tempcube[6] = tempcube[5];
tempcube[5] = temps;
}
void rotatey()
{
char temps;
temps = tempcube[2];
tempcube[2] = tempcube[3];
tempcube[3] = tempcube[5];
tempcube[5] = tempcube[4];
tempcube[4] = temps;
}
void rotatez()
{
char temps;
temps = tempcube[1];
tempcube[1] = tempcube[3];
tempcube[3] = tempcube[6];
tempcube[6] = tempcube[4];
tempcube[4] = temps;
}

int main()
{
#ifdef LOCAL
freopen("xt4-4.in","r",stdin);
freopen("xt4-4.out","w",stdout);
#endif
char temp;
while((temp = getchar())!=EOF)
{
memset(cube1,0,sizeof(cube1));
memset(cube2,0,sizeof(cube2));
sum1 = 0;
sum2 = 0;
while(!isalpha(temp)&&temp!=EOF) temp=getchar();
if(temp == EOF) break;
cube1[1] = temp;
sum1 += code(cube1[1]);
for(int i = 2; i <= 6; i++)
{
cube1[i] = getchar();
sum1 += code(cube1[i]);
}
for(int i = 1; i <= 6; i++)
{
cube2[i] = getchar();
sum2 += code(cube2[i]);
}
#ifdef TESTING
for(int i = 1; i <= 6; i++) printf("%c",cube1[i]);
printf("\nsum1 = %d\n",sum1);
for(int i = 1; i <= 6; i++) printf("%c",cube2[i]);
printf("\nsum2 = %d\n",sum2);
#endif
if(sum1 != sum2)
{
printf("FALSE\n");
continue;
}
for(int i = 1; i <= 6; i++) tempcube[i] = cube1[i];
int result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else rotatey();
rotatex();
result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else rotatey();
rotatex();
result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else rotatey();
rotatex();
result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else rotatey();
rotatez();
result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else rotatey();
rotatez();
rotatez();
result = check();
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {rotatey();result = check();}
if(!result) {printf("TRUE\n");continue;}
else {printf("FALSE\n");continue;}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: