zoukankan      html  css  js  c++  java
  • 算法习题---4-4骰子涂色(UVa253)

    一:题目

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

    (一)题目详解

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

    (二)案例展示

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

    (三)样例输入

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

    (四)样例输出

    TRUE
    FALSE
    FALSE

    二:代码实现

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

    交换任意两个面

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

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

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

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

    bool judgeMidColor()
    {
        int j = 2,k;
        char p_1_m[4], p_2_m[4];    //按照前右后左顺序获取两个骰子的数据
    
        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 = 2; i < 6;i++)    //用P_2中间的字符对P_1的进行比较
        {
            j = 2,k=i;
            while (p_2_m[k]==p_1_m[j]&&j!=6)
            {
                k++,j++;
                if (k == 6) k = 2;
            }
            if (j == 6) return true;
        }
        return false;
    }

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

    bool judgeSame()
    {for (int i = 1; i < 7;i++)    //比较顶部
            if (p_2[i] == p_1[1] && p_2[7 - i] == p_1[6])  //比较顶部,移动第二个的顶部底部与第一个相同,从而我们只需要比较中间四个面即可
            {
                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 = 1; i <= 6; i++) scanf("%c", &p_1[i]);
            for (int i = 1; i <= 6; i++) scanf("%c", &p_2[i]);
            getchar();
            //进行骰子判断
            if (judgeSame()) printf("TRUE
    ");
            else printf("FALSE
    ");
        }
    
        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[7], p_2[7];
    
    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[1], b = p_2[6];    //对应顶部、底部
        p_2[1] = p_2[n], p_2[6] = p_2[7 - n];    //移动到顶部
        p_2[7 - n] = b, p_2[n] = t;    //将原来顶部数据移位
    }
    
    void turnP_2(int pos)
    {
        if (pos == 1)
            return;
        if (pos == 6)    //对面-底面6比较特殊
        {
            ExchangePos(1, 6);    //先调转1,6
            ExchangePos(3, 4);    //可以选择调转3,4或者2,5,这里转3,4
        }
        if (pos!=1&&pos!=6)
        {
            MoveToTop(pos);    //开始处理中间4个面        谁移动到1处,1就移动到它的对面
        }
    }
    
    bool judgeMidColor()
    {
        int j = 2,k;
        char p_1_m[4], p_2_m[4];    //按照前右后左顺序获取两个骰子的数据
    
        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 = 2; i < 6;i++)    //用P_2中间的字符对P_1的进行比较
        {
            j = 2,k=i;
            while (p_2_m[k]==p_1_m[j]&&j!=6)
            {
                k++,j++;
                if (k == 6) k = 2;
            }
            if (j == 6) return true;
        }
        return false;
    }
    
    bool judgeSame()
    {
        for (int i = 1; i < 7;i++)    //比较顶部
            if (p_2[i] == p_1[1] && p_2[7 - i] == p_1[6])
            {
                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 = 1; i <= 6; i++) scanf("%c", &p_1[i]);
            for (int i = 1; i <= 6; i++) scanf("%c", &p_2[i]);
            getchar();
            //进行骰子判断
            if (judgeSame()) printf("TRUE
    ");
            else printf("FALSE
    ");
        }
    
        freopen("CON", "r", stdin);
        freopen("CON", "w", stdout);
    }
    全部代码
  • 相关阅读:
    tr加不上边框
    placeholder 用法
    <input/>文本输入框效果:
    colspan="2"、列、rowspan="3"、行、用法!
    CSS--实现小三角形
    “div+css”下拉菜单
    HDU4624 Endless Spin(概率&&dp)
    chanme的博客搬家了!
    HDU5487 Difference of Languages(BFS)
    HDU5469 Antonidas(树分治&&哈希)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/11146185.html
Copyright © 2011-2022 走看看