分別對兩個骰子的六個面塗色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); }