算法习题---4-4骰子涂色(UVa253)
一:题目
分别对两个骰子的六个面涂色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)的更多相关文章
- 骰子涂色 (Cube painting,UVa 253)
题目描述:算法竞赛入门习题4-4 题目思路:1.旋转其中一个骰子进行匹配 2.进行遍历,如果匹配,就进行相对面的匹配 3.三个对立面都匹配即是一样等价的 //没有按照原题的输入输出 #include ...
- UVa 253 骰子涂色
https://vjudge.net/problem/UVA-253 题意:输入两个骰子的六面颜色,判断是否等价. 思路:我最想到的是暴力,不过一直错,也不知道哪里错了.第二种方法就是在一个骰子里出现 ...
- 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题: P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...
- BZOJ 1260:[CQOI2007]涂色paint
(⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述:Description假设你有一条长度为5的木版,初始时没有涂过任何颜色 ...
- 1260: [CQOI2007]涂色paint
Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...
- 【BZOJ-1260】涂色paint 区间DP
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1147 Solved: 698[Submit][Sta ...
- 并查集(涂色问题) HDOJ 4056 Draw a Mess
题目传送门 题意:给出一个200 * 50000的像素点矩阵,执行50000次操作,每次把一个矩形/圆形/菱形/三角形内的像素点涂成指定颜色,问最后每种颜色的数量. 分析:乍一看,很像用线段树成段更新 ...
- hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)
提议分析: 1 <= N <= 4747 很明显应该不会有规律的,打表发现真没有 按题意应该分成两种情况考虑,然后求其异或(SG函数性质) (1)找出单独的一个(一列中只有一个) (2)找 ...
- 【DP】BZOJ 1260: [CQOI2007]涂色paint
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 893 Solved: 540[Submit][Stat ...
随机推荐
- 利用os模块求一个文件夹的大小。
一.递归方法 def size(path): #给定一个初始的文件夹路径 num = 0 list_name = os.listdir(path) #利用os模块方法,以列表的形式获得该文件夹下面的所 ...
- Gitlab,Mac下生成SSH Key222
git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以要使用远程的git则需要ssh的配置.简单的说,Git - 版本控制工具:Github是一个网站,提供给用户空间创建git仓储 ...
- Java锁--CountDownLatch
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3533887.html CountDownLatch简介 CountDownLatch是一个同步辅助类,在 ...
- 企业级本地yum源配置方案详解
因目前企业生产网络禁止联网,对于使用Linux的我们来说,非常不方便,想要使用yum源都很困难,挂dvd又不能完全满足要求,所以自建一个企业级的yum源,定时从公网同步到本地,然后生产网络直接配置在本 ...
- group_concat 排序并取前三个
substring_index(group_concat(distinct num order by num desc),',',3)
- Jmeter之JDBC类型组件
一.背景 在测试过程中,避免不了与数据库打交道,比如数据的校验.数据的准备或者重置操作,又或者对数据库进行增删改查,基于以上诉求,在Jmeter中是如何实现的呢.可使用JDBC类型组件来实现以上功能操 ...
- ORACLE数据库误操作执行了DELETE,该如何恢复数据?
ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...
- PHP基础语法之 位运算
写了几年PHP的人都好奇说,没有用过位运算符.所以,此处你看二进制看的头晕,就去T¥M¥D吧. 位运算符基本不用,我们也将这个知识设置为了解级别.位运算符的知识点,你不想学习也可以.等以后用到位运算的 ...
- Codeforces Round #586
目录 Contest Info A. Cards B. Multiplication Table C. Substring Game in the Lesson D. Alex and Julian ...
- svg创建分支
是这样的 我之前的项目上传到svn上一直没有开过分支,今天其中的一个项目改动会比较大,想创建一个分支,在此分支上修改(目的是改动如果比较大,不想影响原来主干上的分支) 首先打开我们的项目存放的文件:右 ...