首页 > 代码库 > UVa 253 骰子涂色

UVa 253 骰子涂色

https://vjudge.net/problem/UVA-253

题意:输入两个骰子的六面颜色,判断是否等价。

思路:我最想到的是暴力,不过一直错,也不知道哪里错了。第二种方法就是在一个骰子里出现的一对颜色在第二个骰子也有,只要三对颜色都匹配成功,那么就是等价的。

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 char str[20];
 7 int vis[20];
 8 int ok;
 9 
10 int main()
11 {
12     //freopen("D:\\txt.txt", "r", stdin);
13     while (gets(str)!=NULL)
14     {
15         ok = 1;
16         memset(vis, 0, sizeof(vis));
17         for (int i = 0; i < 3;i++)
18         for (int j = 6; j < 12; j++)
19         {
20             if (!vis[j] && str[i] == str[j] && str[5 - i] == str[17 - j])
21             {
22                 vis[j] = vis[17 - j] = 1;
23                 break;           //这个break必须得加
24             }
25         }
26         for (int i = 6; i < 12; i++)
27         {
28             if (!vis[i])
29             {
30                 ok = 0;
31                 cout << "FALSE" << endl;
32                 break;
33             }
34         }
35         if (ok)  cout << "TRUE" << endl;
36     }
37     return 0;
38 }

再附上我的暴力,不过是wrong的。先留着吧,以后说不定我就能发现哪里错了。

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 char str[20], s1[7], s2[7], s3[7], s4[7];
 7 int vis[20];
 8 int ok;
 9 
10 void solve(int cur)
11 {
12     if (cur == 3)
13     {
14         s3[6] = \0;
15         for (int k = 0; k < 3; k++)
16         {
17             s4[k] = s3[k + 3];
18             s4[k + 3] = s3[k];
19         }
20         s4[6] = \0;
21         if (!strcmp(s1, s3) || !strcmp(s1, s4))
22         {
23             ok = 1;
24         }
25     }
26     else
27     {
28         for (int i = 0; i < 3; i++)
29         {
30             if (ok) return;
31             if (!vis[i])
32             {
33                 s3[cur] = s2[i];
34                 s3[5 - cur] = s2[5 - i];
35                 vis[i] = 1;
36                 solve(cur + 1);
37                 vis[i] = 0;
38             }
39         }
40     }
41 }
42 
43 int main()
44 {
45     //freopen("D:\\txt.txt", "r", stdin);
46     while (gets(str) != NULL)
47     {
48         memset(vis, 0, sizeof(vis));
49         memcpy(s1, str, 6);
50         memcpy(s2, str + 6, 6);
51         s1[6] = \0;
52         s2[6] = \0;
53         ok = 0;
54         solve(0);
55         if (ok)        cout << "TRUE" << endl;
56         else cout << "FALSE" << endl;
57     }
58     return 0;
59 }

 

UVa 253 骰子涂色