fork download
  1. #include <stdio.h>
  2. #define UP 0
  3. #define LEFT 1
  4. #define FRONT 2
  5. #define RIGHT 3
  6. #define BACK 4
  7. #define DOWN 5
  8.  
  9. char rubiks[6][4];
  10. char rotateIndex[6][3][4][2] = {
  11. {{{0, 0}, {0, 2}, {0, 3}, {0, 1}}, {{1, 0}, {2, 0}, {3, 0}, {4, 0}}, {{1, 1}, {2, 1}, {3, 1}, {4, 1}}},
  12. {{{1, 0}, {1, 2}, {1, 3}, {1, 1}}, {{4, 1}, {5, 2}, {2, 2}, {0, 2}}, {{4, 3}, {5, 0}, {2, 0}, {0, 0}}},
  13. {{{2, 0}, {2, 2}, {2, 3}, {2, 1}}, {{1, 1}, {5, 0}, {3, 2}, {0, 3}}, {{1, 3}, {5, 1}, {3, 0}, {0, 2}}},
  14. {{{3, 0}, {3, 2}, {3, 3}, {3, 1}}, {{2, 1}, {5, 1}, {4, 2}, {0, 1}}, {{2, 3}, {5, 3}, {4, 0}, {0, 3}}},
  15. {{{4, 0}, {4, 2}, {4, 3}, {4, 1}}, {{3, 1}, {5, 3}, {1, 2}, {0, 0}}, {{3, 3}, {5, 2}, {1, 0}, {0, 1}}},
  16. {{{5, 0}, {5, 2}, {5, 3}, {5, 1}}, {{1, 3}, {4, 3}, {3, 3}, {2, 3}}, {{1, 2}, {4, 2}, {3, 2}, {2, 2}}}
  17. };
  18. char colors[6] = {'W', 'O', 'B', 'G', 'Y', 'R'};
  19. int n;
  20.  
  21. void readRubiksState() {
  22. char state[30];
  23. scanf("%d %s", &n, state);
  24. for (int i=0; i<6; i++) {
  25. for (int j=0; j<4; j++) {
  26. rubiks[i][j] = state[i * 4 + j];
  27. }
  28. }
  29. }
  30.  
  31. // Pass UP/LEFT/FRONT/RIGHT/BACK/DOWN as parameters to perform the move
  32. void move(int face) {
  33. for (int i=0; i<3; i++) {
  34. for (int j=0; j<3; j++) {
  35. int ax = rotateIndex[face][i][j][0];
  36. int ay = rotateIndex[face][i][j][1];
  37. int bx = rotateIndex[face][i][j+1][0];
  38. int by = rotateIndex[face][i][j+1][1];
  39. char tmp = rubiks[ax][ay];
  40. rubiks[ax][ay] = rubiks[bx][by];
  41. rubiks[bx][by] = tmp;
  42. }
  43. }
  44. }
  45.  
  46. // Print the Rubik's Cube state for debugging purposes
  47. void printRubiks() {
  48. printf(" %c%c\n %c%c\n", rubiks[0][0], rubiks[0][1], rubiks[0][2], rubiks[0][3]);
  49. for (int i=1; i<5; i++) printf("%c%c", rubiks[i][0], rubiks[i][1]);
  50. printf("\n");
  51. for (int i=1; i<5; i++) printf("%c%c", rubiks[i][2], rubiks[i][3]);
  52. printf("\n %c%c\n %c%c\n", rubiks[5][0], rubiks[5][1], rubiks[5][2], rubiks[5][3]);
  53. }
  54.  
  55. // Return 1 if the Rubik's Cube is solved, otherwise return 0
  56. int isSolved() {
  57. int status = 0;
  58. for (int i=0; i<6; i++) {
  59. for (int j=1; j<4; j++) if (rubiks[i][0] != rubiks[i][j]) return 0;
  60. for (int j=0; j<6; j++) {
  61. if (colors[j] == rubiks[i][0]) {
  62. status |= (1<<j);
  63. break;
  64. }
  65. }
  66. }
  67. return ((1 << 6) - 1 == status);
  68. }
  69.  
  70. // Return 1 if the Rubik's Cube can be solved within n moves, otherwise return 0
  71. int solve(int n) {
  72. // TODO: utilize move(), printRubiks(), isSolved() to implement the function
  73. return 0;
  74. }
  75.  
  76. int main() {
  77. int t;
  78. scanf("%d", &t);
  79. while (t--) {
  80. readRubiksState();
  81. printf("%s", (solve(n) ? "Yes\n" : "No\n"));
  82. }
  83. return 0;
  84. }
Success #stdin #stdout 0.01s 5432KB
stdin
2
5 OYGGBYWWOORGWGRYRYBOBWBR
5 RYBGGYWGRYWROBBROYWOOWBG
stdout
No
No