算法习题---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 ...
随机推荐
- 快捷键和功能键、进入DOS命令行的方法、DOS命令讲解、java跨平台原理、JRE和JDK的定义、书写格式
快捷键和功能键A:键盘功能键* a:Tab* b:Shift* c:Ctrl* d:Alt* e:空格 * f:Enter* g:Window* h:上下左右键* i:PrtSc(PrintScree ...
- rhel7.0替换centos yum源
1:卸载原先的yum 2:安装centos的yum 有以下的yum yum-utils-1.1.31-24.el7.noarch yum-langpacks-0.4.2-3.el7.noarch yu ...
- Vue中img的src属性绑定
正确:<img :src=" 'files/'+value.src "> 或 <img :src="value.src">错误:< ...
- CSS绝对定位详解
设置为绝对定位的元素框从文档流完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块.直线电机生产厂家 元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样.元素 ...
- Navicat连接Oracle报ORA-12737错误
替换oci.dll 文件分享百度网盘:链接:https://pan.baidu.com/s/1wayojGlKcgdMRZTvBqAUgw 密码:3d6j 把下载的文件放到Navicat文件夹里,然后 ...
- 九.配置SMB共享(Samba共享)
• Samba 软件项目 – 用途:为客户机提供共享使用的文件夹 – 协议:SMB(TCP 139).CIFS(TCP 445) • 所需软件包:samba • 系统服务:smb 管理共享账号 ...
- 强大的捉包工具Fiddler
Fiddler2出现 creation of the root certificate was not successful 错误 http://www.zhaokeli.com/Article/63 ...
- exam8.3
rank25凉凉好吧......T1:... 一开始完全** 手玩给的那张图(不放图,我太饿把图吃了) 发现对于任一个节点,减去上一个比他小的斐波那契数就是父 ...
- Python的is和==
is是对比地址:==是对比值
- matplot 绘制折线图
#coding=utf-8 import matplotlib.pyplot as pltx_data = ['2011','2012','2013','2014','2015','2016','20 ...