日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cube painting UVA - 253

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cube painting UVA - 253 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要仔細仔細仔細看題,不然會繞到好遠,理清思路的話沒什么難度,應該可以有好多種方法。

對比兩個給出的骰子,比較他們是不是同一個(有相同方式的上色)。輸入輸出很友好,沒有卡人的地方。

注意要按給定的方式進行上色,題目已經默認給出了一個正方體對六個面的編號(這個編號肯定對應是當前狀態的)

也就是說千萬要注意,如果你認為1,6面不動的話,可以將rbgggr中的2~5位做順延變成 gbgg然后ggbg gggb的話那就錯了!

按照標號的方式 假如以1為軸向右旋轉,則新的標號順序1*~6*會變為135246這樣 也就是bggg變為了ggbg。

?

思路是固定第二個骰子,用第一個骰子的三個對面來匹配骰子二的1-6這一對面,若成功,則對于剩下四個面來與骰子二做判定。

其實只要時固定了一個面作為頂,那么新的標號順序就能通過初始順序旋轉求出來。一共六種,分別對應每個面當頂面。自己想一下就能想出來。

然后對于中間四個面的旋轉匹配也有跡可循。同樣是按照規律 共有四種狀態依次循環(廢話, 五次就轉一圈回來了)。

接下來只要全部枚舉出最多4*6種狀態就可以判斷這兩個骰子是否相等了,上代碼。

#include<iostream> #include<string> #define rep(i,n,t) for(int i=(n);i<(t);i++) using namespace std; int main() {string S1, S2;int dir[6][6] = { { 0,1,2,3,4,5 },{ 1,5,2,3,0,4 },{ 2,1,5,0,4,3 },{ 3,1,0,5,4,2 },{ 4,0,2,3,5,1 },{ 5,4,2,3,1,0 } };int bod[4][4] = { { 0,1,2,3 },{ 2,0,3,1 },{ 3,2,1,0 },{ 1,3,0,2 } };int yu[] = { 5,4,3,2,1,0 };while (cin >> S1){bool flag = false;//得到S1,S2S2 = S1.substr(6, 6);S1.erase(6); // rep(i, 0, 6){if (S2[0] == S1[i] && S2[5] == S1[yu[i]]) {string head, body, tail;head = S1[dir[i][0]];rep(j, 1, 5) body += S1[dir[i][j]];tail = S1[dir[i][5]];rep(j, 0, 4) {string temp;rep(k, 0, 4) temp+= body[bod[j][k]];if (head + temp + tail == S2) flag = true;}}}if (flag) cout << "TRUE" << endl;else cout << "FALSE" << endl;//條件初始化 S1.clear(); S2.clear();}return 0; }

要注意,這個題還有另一種解法,就是對比3對 像對面,若骰子一二的三對像對面都相等,則兩個骰子全等。

這個方法存在漏洞,但是也通過了ac,提醒了我們程序要魯棒性強,不然發生這種意外情況時根本考慮不到。意識不到自己的算法竟然有錯,會在錯誤的路上越走越遠。

因為有三種顏色,ggbrrbbgbrrg用上述解法會返回true,but should be false instead of true。

附別人寫的解法二代碼,很簡潔

#include <cstdio> #include <cstring>char str[15]; int vis[3]; /*每兩個對面形成一組顏色對, 每個正方體有三個顏色對,匹配下三個顏色對是否相同。(用vis標記檢查順序)*/int main() {while(scanf("%s", str) != EOF){int cnt = 0;memset(vis, 0, sizeof(vis));for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){if((str[i] == str[6+j] && str[5-i] == str[11-j]) || (str[i] == str[11-j] && str[5-i] == str[6+j]) && !vis[j]){vis[j] = 1;cnt++;break;}}}if(cnt == 3) printf("TRUE\n");else printf("FALSE\n");} }

?

轉載于:https://www.cnblogs.com/worldcreator-zh/p/10562187.html

總結

以上是生活随笔為你收集整理的Cube painting UVA - 253的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。