一:题目
分别对两个骰子的六个面涂色r-红 b-蓝 g-绿,通过转动骰子,看两个骰子是不是一样的涂色方法
(一)题目详解
题目规定了正方体的六个面的序号:从1-6,按照这个需要提供涂色序列
(二)案例展示
上面是提供的两个骰子,我们将第二个骰子向右转90度(一个面),可以得到第一个骰子的样式。故输出TRUE
(三)样例输入
rbgggrrggbgr //一共3局,每一行是一局,前六个字母是对应第一个骰子,后六个字母对应第二个骰子
rrrbbbrrbbbr
rbgrbgrrrrrg
(四)样例输出
二:代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char p_1[7], p_2[7]; //存放两个骰子颜色序列
交换任意两个面
void ExchangePos(int x, int y)
{
char temp;
temp = p_2[x];
p_2[x] = p_2[y];
p_2[y] = temp;
}
对应中间四个面,将其中任意一个面移动到顶部的操作
void MoveToTop(int n)
{
char t = p_2[1], b = p_2[6]; //对应顶部、底部
p_2[1] = p_2[n], p_2[6] = p_2[7 - n]; //移动到顶部
p_2[7 - n] = b, p_2[n] = t; //将原来顶部数据移位
}
重点:我们都是以第一个骰子为基础,转动第二个骰子来对比第一个
void turnP_2(int pos)
{
if (pos == 1)
return;
if (pos == 6) //对面-底面6比较特殊
{
ExchangePos(1, 6); //先调转1,6
ExchangePos(3, 4); //可以选择调转3,4或者2,5,这里转3,4
}
if (pos!=1&&pos!=6)
{
MoveToTop(pos); //开始处理中间4个面 谁移动到1处,1就移动到它的对面
}
}
进行判断中间一层的颜色顺序《注意要调整原来顺序》
bool judgeMidColor()
{
int j = 2,k;
char p_1_m[4], p_2_m[4]; //按照前右后左顺序获取两个骰子的数据
p_1_m[0] = p_1[2],p_1_m[1] = p_1[4],p_1_m[2] = p_1[5],p_1_m[3] = p_1[3];
p_2_m[0] = p_2[2],p_2_m[1] = p_2[4],p_2_m[2] = p_2[5],p_2_m[3] = p_2[3];
for (int i = 2; i < 6;i++) //用P_2中间的字符对P_1的进行比较
{
j = 2,k=i;
while (p_2_m[k]==p_1_m[j]&&j!=6)
{
k++,j++;
if (k == 6) k = 2;
}
if (j == 6) return true;
}
return false;
}
判断两个骰子是否同款样式
bool judgeSame()
{for (int i = 1; i < 7;i++) //比较顶部
if (p_2[i] == p_1[1] && p_2[7 - i] == p_1[6]) //比较顶部,移动第二个的顶部底部与第一个相同,从而我们只需要比较中间四个面即可
{
turnP_2(i); //进行旋转
if (judgeMidColor()) //进行判断,因为顶部、底部固定,我们只需要判断中间4个数据经过旋转后是否一致即可 abcd bcda 就可以
return true;
}
return false;
}
主函数
void main()
{
FILE* fp = freopen("data4.in", "r", stdin);
freopen("data4.out", "w", stdout);
while (!feof(fp))
{ //读取数据
for (int i = 1; i <= 6; i++) scanf("%c", &p_1[i]);
for (int i = 1; i <= 6; i++) scanf("%c", &p_2[i]);
getchar();
//进行骰子判断
if (judgeSame()) printf("TRUE
");
else printf("FALSE
");
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}
全部代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char p_1[7], p_2[7];
void ExchangePos(int x, int y)
{
char temp;
temp = p_2[x];
p_2[x] = p_2[y];
p_2[y] = temp;
}
void MoveToTop(int n)
{
char t = p_2[1], b = p_2[6]; //对应顶部、底部
p_2[1] = p_2[n], p_2[6] = p_2[7 - n]; //移动到顶部
p_2[7 - n] = b, p_2[n] = t; //将原来顶部数据移位
}
void turnP_2(int pos)
{
if (pos == 1)
return;
if (pos == 6) //对面-底面6比较特殊
{
ExchangePos(1, 6); //先调转1,6
ExchangePos(3, 4); //可以选择调转3,4或者2,5,这里转3,4
}
if (pos!=1&&pos!=6)
{
MoveToTop(pos); //开始处理中间4个面 谁移动到1处,1就移动到它的对面
}
}
bool judgeMidColor()
{
int j = 2,k;
char p_1_m[4], p_2_m[4]; //按照前右后左顺序获取两个骰子的数据
p_1_m[0] = p_1[2],p_1_m[1] = p_1[4],p_1_m[2] = p_1[5],p_1_m[3] = p_1[3];
p_2_m[0] = p_2[2],p_2_m[1] = p_2[4],p_2_m[2] = p_2[5],p_2_m[3] = p_2[3];
for (int i = 2; i < 6;i++) //用P_2中间的字符对P_1的进行比较
{
j = 2,k=i;
while (p_2_m[k]==p_1_m[j]&&j!=6)
{
k++,j++;
if (k == 6) k = 2;
}
if (j == 6) return true;
}
return false;
}
bool judgeSame()
{
for (int i = 1; i < 7;i++) //比较顶部
if (p_2[i] == p_1[1] && p_2[7 - i] == p_1[6])
{
turnP_2(i); //进行旋转
if (judgeMidColor()) //进行判断,因为顶部、底部固定,我们只需要判断中间4个数据经过旋转后是否一致即可 abcd bcda 就可以
return true;
}
return false;
}
void main()
{
FILE* fp = freopen("data4.in", "r", stdin);
freopen("data4.out", "w", stdout);
while (!feof(fp))
{ //读取数据
for (int i = 1; i <= 6; i++) scanf("%c", &p_1[i]);
for (int i = 1; i <= 6; i++) scanf("%c", &p_2[i]);
getchar();
//进行骰子判断
if (judgeSame()) printf("TRUE
");
else printf("FALSE
");
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}
全部代码