习题4-4骰子涂色 UVa253
感悟。
1、阅读书中题目,从网站下载英文原题,重点在看输入输出数据与格式。
2、位置摆在1位置的面有6种可能,位置摆在2位置的面有4种可能,共计24种可能。
3、第一种思路,将24种可能枚举列出。
4、第二种思路,找规律,将24种可能用程序算出。
5、不管用哪种思路,先对1摆在1位置的6种可能进行枚举,还真找到了点规律。
6、对面之和为7,只要前三个面序号知道,另三个面就可以算出。
7、1-6对面,2-5对面,3-4对面。
8、再针对2位置的4种可能进行枚举,格式如下:
1位置 俯视顺时针
1 2 3 5 4
2 1 4 6 3
3 1 2 6 5
4 1 5 6 2
5 1 3 6 4
6 2 4 5 3
9、有了思路后,编码很快,稍作调试,通过样例。提交AC,当天搞定,此题就难度而言,相比前几道,可定义为水题。
附上AC代码,运行环境Dev-C++4.9.9.2
#include <stdio.h>
#include <string.h>
char figure[30][10];
void printb(){
int i,j;
for(i=1;i<=24;i++){
for(j=1;j<=6;j++){
printf("%c",figure[i][j]);
}
printf("\n");
}
}
int main(){
char source[20];
char a[10],b[10];
int i,j,k;
char second[10][10]={"","2354","1463","1265","1562","1364","2453"};
int rcount,ccount;
int pos;
int find;
while(scanf("%s",source)!=EOF){
for(i=1;i<=6;i++){
a[i]=source[i-1];
b[i]=source[i-1+6];
}
rcount=0;
for(i=1;i<=6;i++){//位置1面有6种可能
for(j=0;j<4;j++){//位置2面有4种可能
ccount=0;
rcount++;
ccount++;
figure[rcount][ccount]=b[i];//1面
figure[rcount][6]=b[7-i];//6面
ccount++;
pos=second[i][j]-'0';
figure[rcount][ccount]=b[pos];//2面
figure[rcount][7-ccount]=b[7-pos];//5面
ccount++;
pos=second[i][(j+1)%4]-'0';
figure[rcount][ccount]=b[pos];//3面
figure[rcount][7-ccount]=b[7-pos];//4面
}
}
find=0;
for(i=1;i<=24;i++){
for(j=1;j<=6;j++){
if(figure[i][j]!=a[j])
break;
}
if(j==7){
find=1;
break;
}
}
//printb();
if(find==1){
printf("TRUE\n");
}else{
printf("FALSE\n");
}
}
return 0;
}