生活随笔
收集整理的這篇文章主要介紹了
模拟:二阶魔方问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題面:
一個二階魔方,是一個2×2×2的一個立方體組。立方體由八個角組成。
魔方的每一塊都用三維坐標(h, k, l)標記,其中h, k, l∈{0,1}。六個面的每一個都有四個小面,每個小面都有一個正整數。
對于每一步,可以選擇一個特定的面,并把此面順時針或逆時針轉90度。
請你判斷,是否可以在一個步驟還原這個魔方(每個面沒有異色)
輸入的第一行包含一個整數N(N≤30),這是測試用例的數量。
對于每個測試用例,
第 1~4 個數描述魔方的頂面,這是常見的2×2面,由(0,0,1),(0,1,1),(1,0,1),(1,1,1)標記。四個整數對應于上述部分。
第 5~8 個數描述前面,即(1,0,1),(1,1,1),(1,0,0),(1,1,0)的公共面。四個整數
與上述各部分相對應。
第 9~12 個數描述底面,即(1,0,0),(1,1,0),(0,0,0),(0,1,0)的公共面。四個整數與上述各部分相對應。
第 13~16 個數描述背面,即(0,0,0),(0,1,0),(0,0,1),(0,1),(0,1,1)的公共面。四個整數與上述各部分相對應。
第 17~20 個數描述左面,即(0,0,0),(0,0,1),(1,0,0),(1,0,1)的公共面。給出四個整數與上述各部分相對應。
第 21~24 個數描述了右面,即(0,1,1),(0,1,0),(1,1,1),(1,1,0)的公共面。給出四個整數與上述各部分相對應。
換句話說,每個測試用例包含24個整數a、b、c到x。你可以展開表面以獲得平面圖如下:
對于每個測試用例,魔方如果可以至多 “只轉一步” 恢復,輸出YES,則輸出NO。
sample input:
4
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6
6 6 6 6 1 1 1 1 2 2 2 2 3 3 3 3 5 5 5 5 4 4 4 4
1 4 1 4 2 1 2 1 3 2 3 2 4 3 4 3 5 5 5 5 6 6 6 6
1 3 1 3 2 4 2 4 3 1 3 1 4 2 4 2 5 5 5 5 6 6 6 6
sample output:
YES
YES
YES
NO
思路:
- 首先,這道題不要被給定的那一堆坐標迷惑到了,其實他只是告訴你面的順序罷了。
- 在輸入的時候記錄一下已完成的面數,如果能夠在最多一步內完成魔方的復原,則已經是完成的面的面數只能是兩面或者六面。如果不符合可以直接輸出NO
- 如果已經完成了六面,那么一定是正確的,直接輸出YES即可
- 如果完成了兩面,那么我們就開始進行一次判斷,一共有24個面,所以可以用一個具有24個元素的數組進行記錄
- 可以根據給定的圖示做一個小正方體,觀察進行一次旋轉有可能是那四個數字處于同一面。通過flag來記錄是否符合同一顏色的,滿足則置為1。
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std
;
int g
[25];
bool met
[8];
int main()
{int N
,cnt
;bool flag
;scanf("%d",&N
);while(N
--){cnt
= 0;memset(met
,false,sizeof(met
));for(int i
=1;i
<25;i
++)cin
>>g
[i
];if(g
[1]==g
[2]&&g
[2]==g
[3]&&g
[3]==g
[4]){++cnt
;met
[0] = 1;}if(g
[5]==g
[6]&&g
[6]==g
[7]&&g
[7]==g
[8]){++cnt
;met
[1] = 1;}if(g
[9]==g
[10]&&g
[10]==g
[11]&&g
[11]==g
[12]){++cnt
;met
[2] = 1;}if(g
[13]==g
[14]&&g
[14]==g
[15]&&g
[15]==g
[16]){++cnt
;met
[3] = 1;}if(g
[17]==g
[18]&&g
[18]==g
[19]&&g
[19]==g
[20]){++cnt
;met
[4] = 1;}if(g
[21]==g
[22]&&g
[22]==g
[23]&&g
[23]==g
[24]){++cnt
;met
[5] = 1;}if(cnt
==6) cout
<<"YES"<<endl
;else if(cnt
==2){flag
= 0;if(met
[0]&&met
[2]){if(g
[13]==g
[14]&&g
[13]==g
[21]&&g
[13]==g
[23]){if(g
[22]==g
[24]&&g
[22]==g
[5]&&g
[22]==g
[6])if(g
[7]==g
[8]&&g
[7]==g
[18]&&g
[7]==g
[20])if(g
[17]==g
[19]&&g
[17]==g
[15]&&g
[17]==g
[16])flag
= 1;}else if(g
[13]==g
[14]&&g
[13]==g
[18]&&g
[13]==g
[20]){if(g
[17]==g
[19]&&g
[17]==g
[5]&&g
[17]==g
[6])if(g
[7]==g
[8]&&g
[7]==g
[21]&&g
[7]==g
[23])if(g
[22]==g
[24]&&g
[22]==g
[15]&&g
[22]==g
[16])flag
= 1;}}else if(met
[1] && met
[3]){if(g
[1]==g
[2]&&g
[1]==g
[23]&&g
[1]==g
[24]){if(g
[21]==g
[22]&&g
[21]==g
[9]&&g
[21]==g
[10])if(g
[11]==g
[12]&&g
[11]==g
[19]&&g
[11]==g
[20])if(g
[17]==g
[18]&&g
[17]==g
[3]&&g
[17]==g
[4])flag
= 1;}else if(g
[1]==g
[2]&&g
[1]==g
[19]&&g
[1]==g
[20]){if(g
[17]==g
[18]&&g
[17]==g
[9]&&g
[17]==g
[10])if(g
[11]==g
[12]&&g
[11]==g
[23]&&g
[11]==g
[24])if(g
[21]==g
[22]&&g
[21]==g
[3]&&g
[21]==g
[4])flag
= 1;}}else if(met
[4] && met
[5]){if(g
[1]==g
[3]&&g
[1]==g
[14]&&g
[1]==g
[16]){if(g
[13]==g
[15]&&g
[13]==g
[10]&&g
[13]==g
[12])if(g
[9]==g
[11]&&g
[9]==g
[6]&&g
[9]==g
[8])if(g
[5]==g
[7]&&g
[5]==g
[2]&&g
[5]==g
[4])flag
= 1;}else if(g
[1]=g
[3]&&g
[1]==g
[6]&&g
[1]==g
[8]){if(g
[5]==g
[7]&&g
[5]==g
[10]&&g
[5]==g
[12])if(g
[9]==g
[11]&&g
[9]==g
[14]&&g
[9]==g
[16])if(g
[13]==g
[15]&&g
[13]==g
[2]&&g
[13]==g
[4])flag
= 1;}}if(flag
) cout
<<"YES"<<endl
;else cout
<<"NO"<<endl
;}else cout
<<"NO"<<endl
;}return 0;
}
- 在剛開始看到這道題的時候,我思考的方向是,一個二階魔方,只可能存在八種可能性(假設魔方處于xyz三維坐標系,則存在繞xy軸順時針逆時針擰動,由于二階,所以是八種)
- 然后設定一個用于判斷是否當前狀態符合魔方復原條件的函數,每次函數處理后都進行判斷
- 思考起來非常容易,但是實現的時候很容易繞進去,最后的代碼能通過樣例和自己出的數據,但是沒法通過VJ,應該是某個數轉錯了(放出這個很長的蒟蒻代碼僅用于幫助了解思路,如果有大神能指出錯誤不勝感激)
#include<iostream>
#include<cstdio>
using namespace std
;
int count
;
int gezi
[25];
bool whether()
{count
=0;for(int i
=1;i
<25;i
=i
+4){int j
=i
;if(gezi
[j
]==gezi
[j
+1]&&gezi
[j
]==gezi
[j
+2]&&gezi
[j
]==gezi
[j
+3])count
++;}if(count
==6)return true;else return false;
}
void xshun1()
{int temp1
=gezi
[1];int temp2
=gezi
[2];gezi
[1]=gezi
[17];gezi
[2]=gezi
[18];gezi
[17]=gezi
[12];gezi
[18]=gezi
[11];gezi
[11]=gezi
[22];gezi
[12]=gezi
[21];gezi
[21]=temp1
;gezi
[22]=temp2
;
}void xshun2()
{int temp3
=gezi
[3];int temp4
=gezi
[4];gezi
[3]=gezi
[19];gezi
[4]=gezi
[20];gezi
[19]=gezi
[10];gezi
[20]=gezi
[9];gezi
[10]=gezi
[23];gezi
[9]=gezi
[24];gezi
[23]=temp3
;gezi
[24]=temp4
;
}
void xni1()
{int temp1
=gezi
[1];int temp2
=gezi
[2];gezi
[1]=gezi
[21];gezi
[2]=gezi
[22];gezi
[21]=gezi
[12];gezi
[22]=gezi
[11];gezi
[12]=gezi
[17];gezi
[11]=gezi
[18];gezi
[17]=temp1
;gezi
[18]=temp2
;
}void xni2()
{int temp3
=gezi
[3];int temp4
=gezi
[4];gezi
[3]=gezi
[23];gezi
[4]=gezi
[24];gezi
[23]=gezi
[10];gezi
[24]=gezi
[9];gezi
[10]=gezi
[19];gezi
[9]=gezi
[20];gezi
[19]=temp3
;gezi
[20]=temp4
;
}void yshun1()
{int temp1
=gezi
[1];int temp3
=gezi
[3];gezi
[1]=gezi
[13];gezi
[3]=gezi
[15];gezi
[15]=gezi
[11];gezi
[13]=gezi
[9];gezi
[11]=gezi
[7];gezi
[9]=gezi
[5];gezi
[5]=temp1
;gezi
[7]=temp3
;
}void yshun2()
{int temp2
=gezi
[2];int temp4
=gezi
[4];gezi
[2]=gezi
[14];gezi
[4]=gezi
[16];gezi
[14]=gezi
[10];gezi
[16]=gezi
[12];gezi
[10]=gezi
[6];gezi
[12]=gezi
[8];gezi
[6]=temp2
;gezi
[8]=temp4
;
}void yni1()
{int temp1
=gezi
[1];int temp3
=gezi
[3];gezi
[1]=gezi
[5];gezi
[3]=gezi
[7];gezi
[5]=gezi
[9];gezi
[7]=gezi
[11];gezi
[9]=gezi
[13];gezi
[11]=gezi
[15];gezi
[13]=temp1
;gezi
[15]=temp3
;
}void yni2()
{int temp2
=gezi
[2];int temp4
=gezi
[4];gezi
[2]=gezi
[6];gezi
[4]=gezi
[8];gezi
[6]=gezi
[10];gezi
[8]=gezi
[12];gezi
[10]=gezi
[14];gezi
[12]=gezi
[16];gezi
[14]=temp2
;gezi
[16]=temp4
;
}int main()
{int N
;scanf("%d",&N
);while(N
--){for(int i
=1;i
<25;i
++){cin
>>gezi
[i
];}if(whether()){cout
<<"YES"<<endl
;} else {xshun1();if(whether()){cout
<<"YES"<<endl
;continue;}xshun2();if(whether()){cout
<<"YES"<<endl
;continue;}xni1();if(whether()){cout
<<"YES"<<endl
;continue;}xni2();if(whether()){cout
<<"YES"<<endl
;continue;}yshun1();if(whether()){cout
<<"YES"<<endl
;continue;}yshun2();if(whether()){cout
<<"YES"<<endl
;continue;} yni1();if(whether()){cout
<<"YES"<<endl
;continue;} yni2();if(whether()){cout
<<"YES"<<endl
;continue;}cout
<<"NO"<<endl
; }}return 0;
}
總結
以上是生活随笔為你收集整理的模拟:二阶魔方问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。