一:题目

分别对两个骰子的六个面涂色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. 利用os模块求一个文件夹的大小。

    一.递归方法 def size(path): #给定一个初始的文件夹路径 num = 0 list_name = os.listdir(path) #利用os模块方法,以列表的形式获得该文件夹下面的所 ...

  2. Gitlab,Mac下生成SSH Key222

         git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以要使用远程的git则需要ssh的配置.简单的说,Git - 版本控制工具:Github是一个网站,提供给用户空间创建git仓储 ...

  3. Java锁--CountDownLatch

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3533887.html CountDownLatch简介 CountDownLatch是一个同步辅助类,在 ...

  4. 企业级本地yum源配置方案详解

    因目前企业生产网络禁止联网,对于使用Linux的我们来说,非常不方便,想要使用yum源都很困难,挂dvd又不能完全满足要求,所以自建一个企业级的yum源,定时从公网同步到本地,然后生产网络直接配置在本 ...

  5. group_concat 排序并取前三个

    substring_index(group_concat(distinct num order by num desc),',',3)

  6. Jmeter之JDBC类型组件

    一.背景 在测试过程中,避免不了与数据库打交道,比如数据的校验.数据的准备或者重置操作,又或者对数据库进行增删改查,基于以上诉求,在Jmeter中是如何实现的呢.可使用JDBC类型组件来实现以上功能操 ...

  7. ORACLE数据库误操作执行了DELETE,该如何恢复数据?

    ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...

  8. PHP基础语法之 位运算

    写了几年PHP的人都好奇说,没有用过位运算符.所以,此处你看二进制看的头晕,就去T¥M¥D吧. 位运算符基本不用,我们也将这个知识设置为了解级别.位运算符的知识点,你不想学习也可以.等以后用到位运算的 ...

  9. Codeforces Round #586

    目录 Contest Info A. Cards B. Multiplication Table C. Substring Game in the Lesson D. Alex and Julian ...

  10. svg创建分支

    是这样的 我之前的项目上传到svn上一直没有开过分支,今天其中的一个项目改动会比较大,想创建一个分支,在此分支上修改(目的是改动如果比较大,不想影响原来主干上的分支) 首先打开我们的项目存放的文件:右 ...