一:题目

分别对两个骰子的六个面涂色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. 剑指Offer(三十):连续子数组的最大和

    .# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  2. python中赋值和浅拷贝与深拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  3. vue 关于vuex

    <!-- vuex 配置js store.js -->1.引入vue和vuex import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vu ...

  4. vue 下拉框单选、多选以及默认值

    背景: 单选框和多选框 都是使用了 el-select,但传给后端的值类型不一样,多选框传的值是 list类型: ['value1','value2'] ,单选框传值和其他类型一样:设置默认值也是如此 ...

  5. 必备的JS调试技巧汇总

    转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...

  6. eclipse和scala整合,打包配置文件及打包步骤

    我写的是maven项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  7. MongoDB 建立与删除索引

    1.1 在独立服务器上面建立索引 在独立服务器上面创建索引,可以在空闲时间于后台建立索引. 在后台建立索引,可利用background:true参数运行 >db.foo.ensureIndex( ...

  8. ckeditor复制粘贴word

    从word文档中直接粘贴到ckeditor编辑区,查看的时候格式会显示混乱,非常难看.解决方法:   CKEDITOR.cleanWord = function(h, i) { return h; i ...

  9. Ubuntu 下python开发环境的搭建

    一.安装python3 ubuntu自身是安装python2的,例如在ubuntu 16.04中安装的就是python2.7.但我想在python3的环境下进行开发所以就要安装python3.但由于u ...

  10. 斜率dp的模板总结

    #include<cstdio> #include<algorithm> using namespace std; long long sumt[40005],sum[4000 ...