算法習題---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\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[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\n");
        else printf("FALSE\n");
    }

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}
所有代碼
相關文章
相關標籤/搜索