一:题目

分别对两个骰子的六个面涂色r-红 b-蓝 g-绿,通过转动骰子,看两个骰子是不是一样的涂色方法

(一)题目详解

题目规定了正方体的六个面的序号:从1-,按照这个需要提供涂色序列

(二)案例展示

上面是提供的两个骰子,我们将第二个骰子向右转90度(一个面),可以得到第一个骰子的样式。故输出TRUE

(三)样例输入

rbgggrrggbgr  //一共3局,每一行是一局,前六个字母是对应第一个骰子,后六个字母对应第二个骰子
rrrbbbrrbbbr
rbgrbgrrrrrg

(四)样例输出

TRUE
FALSE
FALSE

二:代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h> char p_1[], p_2[];  //存放两个骰子颜色序列

交换任意两个面

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[], b = p_2[]; //对应顶部、底部
p_2[] = p_2[n], p_2[] = p_2[ - n]; //移动到顶部
p_2[ - n] = b, p_2[n] = t; //将原来顶部数据移位
}

重点:我们都是以第一个骰子为基础,转动第二个骰子来对比第一个

void turnP_2(int pos)
{
if (pos == )
return;
if (pos == ) //对面-底面6比较特殊
{
ExchangePos(, ); //先调转1,6
ExchangePos(, ); //可以选择调转3,4或者2,5,这里转3,4
}
if (pos!=&&pos!=)
{
MoveToTop(pos); //开始处理中间4个面 谁移动到1处,1就移动到它的对面
}
}

进行判断中间一层的颜色顺序《注意要调整原来顺序》

bool judgeMidColor()
{
int j = ,k;
char p_1_m[], p_2_m[]; //按照前右后左顺序获取两个骰子的数据

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 = ; i < ;i++) //用P_2中间的字符对P_1的进行比较
{
j = ,k=i;
while (p_2_m[k]==p_1_m[j]&&j!=)
{
k++,j++;
if (k == ) k = ;
}
if (j == ) return true;
}
return false;
}

判断两个骰子是否同款样式

bool judgeSame()
{for (int i = ; i < ;i++) //比较顶部
if (p_2[i] == p_1[] && p_2[ - i] == p_1[])  //比较顶部,移动第二个的顶部底部与第一个相同,从而我们只需要比较中间四个面即可
{
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 = ; i <= ; i++) scanf("%c", &p_1[i]);
for (int i = ; i <= ; i++) scanf("%c", &p_2[i]);
getchar();
//进行骰子判断
if (judgeSame()) printf("TRUE\n");
else printf("FALSE\n");
} 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[], p_2[]; 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[], b = p_2[]; //对应顶部、底部
p_2[] = p_2[n], p_2[] = p_2[ - n]; //移动到顶部
p_2[ - n] = b, p_2[n] = t; //将原来顶部数据移位
} void turnP_2(int pos)
{
if (pos == )
return;
if (pos == ) //对面-底面6比较特殊
{
ExchangePos(, ); //先调转1,6
ExchangePos(, ); //可以选择调转3,4或者2,5,这里转3,4
}
if (pos!=&&pos!=)
{
MoveToTop(pos); //开始处理中间4个面 谁移动到1处,1就移动到它的对面
}
} bool judgeMidColor()
{
int j = ,k;
char p_1_m[], p_2_m[]; //按照前右后左顺序获取两个骰子的数据 p_1_m[] = p_1[],p_1_m[] = p_1[],p_1_m[] = p_1[],p_1_m[] = p_1[];
p_2_m[] = p_2[],p_2_m[] = p_2[],p_2_m[] = p_2[],p_2_m[] = p_2[]; for (int i = ; i < ;i++) //用P_2中间的字符对P_1的进行比较
{
j = ,k=i;
while (p_2_m[k]==p_1_m[j]&&j!=)
{
k++,j++;
if (k == ) k = ;
}
if (j == ) return true;
}
return false;
} bool judgeSame()
{
for (int i = ; i < ;i++) //比较顶部
if (p_2[i] == p_1[] && p_2[ - i] == p_1[])
{
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 = ; i <= ; i++) scanf("%c", &p_1[i]);
for (int i = ; i <= ; i++) scanf("%c", &p_2[i]);
getchar();
//进行骰子判断
if (judgeSame()) printf("TRUE\n");
else printf("FALSE\n");
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}

全部代码

算法习题---4-4骰子涂色(UVa253)的更多相关文章

  1. 骰子涂色 (Cube painting,UVa 253)

    题目描述:算法竞赛入门习题4-4  题目思路:1.旋转其中一个骰子进行匹配 2.进行遍历,如果匹配,就进行相对面的匹配 3.三个对立面都匹配即是一样等价的 //没有按照原题的输入输出 #include ...

  2. UVa 253 骰子涂色

    https://vjudge.net/problem/UVA-253 题意:输入两个骰子的六面颜色,判断是否等价. 思路:我最想到的是暴力,不过一直错,也不知道哪里错了.第二种方法就是在一个骰子里出现 ...

  3. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  4. BZOJ 1260:[CQOI2007]涂色paint

    (⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述:Description假设你有一条长度为5的木版,初始时没有涂过任何颜色 ...

  5. 1260: [CQOI2007]涂色paint

    Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...

  6. 【BZOJ-1260】涂色paint 区间DP

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1147  Solved: 698[Submit][Sta ...

  7. 并查集(涂色问题) HDOJ 4056 Draw a Mess

    题目传送门 题意:给出一个200 * 50000的像素点矩阵,执行50000次操作,每次把一个矩形/圆形/菱形/三角形内的像素点涂成指定颜色,问最后每种颜色的数量. 分析:乍一看,很像用线段树成段更新 ...

  8. hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)

    提议分析: 1 <= N <= 4747 很明显应该不会有规律的,打表发现真没有 按题意应该分成两种情况考虑,然后求其异或(SG函数性质) (1)找出单独的一个(一列中只有一个) (2)找 ...

  9. 【DP】BZOJ 1260: [CQOI2007]涂色paint

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 540[Submit][Stat ...

随机推荐

  1. linux网络编程之socket编程(十三)

    今天继续学习socket编程,从今天起开始学习UDP,具体内容如下: ①.无连接 UDP协议它内部并没有维护端到端的一些连接状态,这跟TCP是不同的,TCP是基于连接的,而在连接的时候是需要进行三次握 ...

  2. python_面向对象——多继承

    1.多继承 class Shenxian: def fly(self): print('神仙会飞~') class Monkey: def eat_peach(self): print('猴子喜欢吃桃 ...

  3. 你应该知道的16个linux命令

    Linux常用命令很多比如cd.ls.pwd.du.df.tail.head.yum.mv.touch.mkdir.cp.tar等,根据工作内容不同,经常使用的命令也不同,比如运维人员使用tail.h ...

  4. vue router.beforeEach(),详解

    outer.beforeEach()一般用来做一些进入页面的限制. 比如没有登录, 就不能进入某些页面,只有登录了之后才有权限查看某些页面...说白了就是路由拦截.第一步 规定进入路由需不需要权限 @ ...

  5. [SCSS] SASS dynamic class properties

    @mixin generateModifers($property) { #{$property}: $padding; &-large { #{$property}: $padding-la ...

  6. ElementUI 之 Cascader 级联选择器指定 value label

    ElementUI 的 Cascader 级联选择器个人觉得很好用,但是对 :options="options" 里的数据格式是有特定要求的:input 框显示的值是 option ...

  7. Poj 2599 Godfather(树的重心)

    Godfather Time Limit: 2000MS Memory Limit: 65536K Description Last years Chicago was full of gangste ...

  8. LibreOJ #116. 有源汇有上下界最大流

    二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...

  9. 快速打造自己的PHPStorm主题

    ---恢复内容开始--- 一个优雅和舒适的界面,可以增加过多写入代码的动力. Phpstorm小型的白色主题比较简陋.为了打造一个优雅和舒适的界面,我们安装一件叫Material Theme UI的插 ...

  10. (转)服务端监控工具:nmon的使用

    在性能测试过程中,对服务端的各项资源使用情况进行监控是很重要的一环.这篇博客,介绍下服务端监控工具:nmon的使用方法.. 一.认识nmon 1.简介 nmon是一种在AIX与各种Linux操作系统上 ...