三阶魔方模拟
原題:zjnu 1196
題意:
給出六個面的初始狀態,每次操作為順時針旋轉一個面,求最后的狀態
解析:
用M[i][j]表示第i面第j個格子的狀態,f[i][j]表示第i個面第j方向的面是哪個面(1上,2右,3下,4左)
旋轉一個面i時,首先是把i面上8個格子交換一下,然后就是相鄰4個面接壤i面的那一行順時針交換一下就可以了
代碼:
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> using namespace std;int M[8][11],f[8][6];void init(){//初始化一個面的上下左右是哪個面f[1][1]=5;f[1][2]=2;f[1][3]=3;f[1][4]=4;f[2][1]=5;f[2][2]=6;f[2][3]=3;f[2][4]=1;f[3][1]=2;f[3][2]=6;f[3][3]=4;f[3][4]=1;f[4][1]=3;f[4][2]=6;f[4][3]=5;f[4][4]=1;f[5][1]=4;f[5][2]=6;f[5][3]=2;f[5][4]=1;f[6][1]=4;f[6][2]=3;f[6][3]=2;f[6][4]=5; }int id(char c){if(c=='W')return 1;if(c=='O')return 2;if(c=='R')return 3;if(c=='B')return 4;if(c=='G')return 5;if(c=='Y')return 6;return 0; }char charid(int a){for(char c='A';c!='Z';c++){if(id(c)==a)return c;} }void outM(){for(int i=1;i<=3;i++){for(int j=1;j<=6;j++){for(int k=2;k>=0;k--){printf("%c ",charid(M[j][i*3-k]));}}printf("\n");} } vector<int>V; void invector(int a,int r){//用vector來交換4個面的某一行,注意壓入的順序按照順時針運動的前后int ar;for(ar=1;ar<=4;ar++){if(f[a][ar]==r)break;}if(ar==1)V.push_back(M[a][1]),V.push_back(M[a][2]),V.push_back(M[a][3]);else if(ar==2)V.push_back(M[a][3]),V.push_back(M[a][6]),V.push_back(M[a][9]);else if(ar==3)V.push_back(M[a][9]),V.push_back(M[a][8]),V.push_back(M[a][7]);else V.push_back(M[a][7]),V.push_back(M[a][4]),V.push_back(M[a][1]); }void outvector(int a,int r){int ar;for(ar=1;ar<=4;ar++){if(f[a][ar]==r)break;}if(ar==1)M[a][1]=V[0],M[a][2]=V[1],M[a][3]=V[2];else if(ar==2)M[a][3]=V[0],M[a][6]=V[1],M[a][9]=V[2];else if(ar==3)M[a][9]=V[0],M[a][8]=V[1],M[a][7]=V[2];else M[a][7]=V[0],M[a][4]=V[1],M[a][1]=V[2];V.erase(V.begin());V.erase(V.begin());V.erase(V.begin()); }void change(int p){//把p面旋轉int d[11];for(int i=1;i<=9;i++)d[i]=M[p][i];M[p][1]=d[7];M[p][2]=d[4];M[p][3]=d[1];M[p][4]=d[8];M[p][6]=d[2];M[p][7]=d[9];M[p][8]=d[6];M[p][9]=d[3];for(int i=1;i<=4;i++)invector(f[p][i],p);for(int i=2;i<=5&&i!=1;i++){if(i>4)i-=4;outvector(f[p][i],p);if(i==1)break;} }int main(){init();char mi[3];for(int i=1;i<=3;i++){for(int j=1;j<=6;j++){for(int k=2;k>=0;k--)scanf("%s",mi),M[j][i*3-k]=id(mi[0]);}}char mid[1009];scanf("%s",mid);for(int i=0;i<strlen(mid);i++){int k=id(mid[i]);//為了方便先把字母轉化成intchange(k);}outM(); }總結
- 上一篇: 6款实用的硬盘、SSD固态硬盘、U盘、储
- 下一篇: 原创:武丁的二个妻子的故事,妇好、妇妌竟