UVA 253 Cube painting
2015-06-06 12:21 eliteGoblin's Blog 阅读(557) 评论(0) 收藏 举报按照 教主 《算法竞赛 入门经典 2nd》 顺序A题, 记下做题过程犯的错误, 提高一次写对的成功率。
题意: 给两个正方体6面涂色, 每天随机涂 R, G, B 中的一种, 判断两正方体经过各种旋转能否等价。
题目见: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=189
注: 被墙了,用 chrome 红杏出墙插件打开。
解题分析: 下图是题目标明6面体每面的顺序, 用以说明每面涂什么颜色。开始没有思路,判断起来异常复杂。参考 http://blog.csdn.net/shiqi_614/article/details/7035558,的思路: 被旋转的立方体每次使其中一面向上, 6种情况, 再旋转其侧面, 共 24种情况, 每次的结果与另一个比较, 穷举, 看是否相同。
实现细节:
1. 用数组记录每面朝上对应的顺序号, 提前在纸上画好, 硬编码在程序中。
2. 题目给的面顺序自己感觉不方便,映射起来很蛋疼,自己标的顺序如下,这需要输入时把给定的串转换下位置即可:
WA记录:
WA一次, 是在硬编码面顺序时搞错了, 通过对比结果看出的。

1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <vector> 5 #include <set> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <ctype.h> 10 #include <math.h> 11 #include <numeric> 12 #include <time.h> 13 #include <deque> 14 15 using namespace std; 16 17 int ar[][6] = { 18 {1, 2, 3, 4, 5, 6}, 19 {2, 6, 3, 1, 5 ,4}, 20 {3, 2, 6, 4, 1, 5}, 21 {4, 1, 3, 6, 5, 2}, 22 {5, 2, 1, 4, 6, 3}, 23 {6, 2, 5, 4, 3, 1} 24 }; 25 bool cmp(string s1, string s2) 26 { 27 for(int i = 0; i < 6; i ++) 28 { 29 string s_rotate; 30 for(int j = 0; j < 6; j ++) 31 { 32 s_rotate += s1[ar[i][j] - 1]; 33 } 34 for(int i = 0; i < 4; i ++) 35 { 36 if(s_rotate == s2) 37 return true; 38 string tmp; 39 tmp += s_rotate[0]; 40 tmp += s_rotate.substr(2, 3); 41 tmp += s_rotate[1]; 42 tmp += s_rotate[5]; 43 s_rotate = tmp; 44 } 45 } 46 return false; 47 } 48 49 void trans(string &s) 50 { 51 string tmp = s; 52 tmp[2 - 1] = s[2 - 1]; 53 tmp[3 - 1] = s[4 - 1]; 54 tmp[4 - 1] = s[5 - 1]; 55 tmp[5 - 1] = s[3 - 1]; 56 s = tmp; 57 } 58 59 int main() 60 { 61 string s1, s2; 62 char sz_buf[32]; 63 while(scanf("%s", sz_buf) != EOF) 64 { 65 s1.assign(sz_buf, sz_buf + 6); 66 s2.assign(sz_buf + 6, sz_buf + 12); 67 trans(s1); 68 trans(s2); 69 if(cmp(s1, s2) ) 70 printf("TRUE\n"); 71 else 72 printf("FALSE\n"); 73 } 74 return 0; 75 }