代码改变世界

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 }
eliteGoblin_RB