Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <queue>
- #include <vector>
- using namespace std;
- /*
- точками изображена часть кубика, которую не видно
- ________
- /⠡ /\
- / ⠡ U B/ \
- /____⠡__/....\
- \ L ⠌ D\ R /
- \ ⠌ F \ /
- \⠌______\/
- */
- //6 граней
- //передняя (F), левая (L), задняя (B), правая (R), верхняя (U) и нижняя (D)
- const vector<char> FACES = { 'F', 'L','B','R','U','D' };
- const int BACK = -1;
- const int FORWARD = 1;
- struct RubiksCube {
- RubiksCube() : faces_dates(26, vector<vector<char>>(2, vector<char>(2))) {}
- bool IsSolved() const {
- for (const auto& face_date : faces_dates) {
- char value = face_date.front().front();
- for (const auto& row : face_date) {
- for (char c : row) {
- if (c != value) return false;
- }
- }
- }
- return true;
- }
- void RotateFaceForward(char face) {
- char save_front_front = faces_dates[face - 'A'].front().front();
- faces_dates[face - 'A'].front().front() = faces_dates[face - 'A'].back().front();
- faces_dates[face - 'A'].back().front() = faces_dates[face - 'A'].back().back();
- faces_dates[face - 'A'].back().back() = faces_dates[face - 'A'].front().back();
- faces_dates[face - 'A'].front().back() = save_front_front;
- }
- void RotateFaceBack(char face) {
- char save_front_front = faces_dates[face - 'A'].front().front();
- faces_dates[face - 'A'].front().front() = faces_dates[face - 'A'].front().back();
- faces_dates[face - 'A'].front().back() = faces_dates[face - 'A'].back().back();
- faces_dates[face - 'A'].back().back() = faces_dates[face - 'A'].back().front();
- faces_dates[face - 'A'].back().front() = save_front_front;
- }
- void DoRotate(char face, int direction) {
- if (direction == FORWARD) {
- //передняя (F), левая (L), задняя (B), правая (R), верхняя (U) и нижняя (D)
- if (face == 'R' || face == 'L') {
- char save_upper_right_F = faces_dates['F' - 'A'].front().back();
- char save_lower_right_F = faces_dates['F' - 'A'].back().back();
- faces_dates['F' - 'A'].front().back() = faces_dates['D' - 'A'].front().back();
- faces_dates['F' - 'A'].back().back() = faces_dates['D' - 'A'].back().back();
- faces_dates['D' - 'A'].front().back() = faces_dates['B' - 'A'].front().back();
- faces_dates['D' - 'A'].back().back() = faces_dates['B' - 'A'].back().back();
- faces_dates['B' - 'A'].front().back() = faces_dates['U' - 'A'].front().back();
- faces_dates['B' - 'A'].back().back() = faces_dates['U' - 'A'].back().back();
- faces_dates['U' - 'A'].front().back() = save_upper_right_F;
- faces_dates['U' - 'A'].back().back() = save_lower_right_F;
- RotateFaceForward('R');
- return;
- }
- if (face == 'B' || face == 'F') {
- char save_upper_right_R = faces_dates['R' - 'A'].front().back();
- char save_lower_right_R = faces_dates['R' - 'A'].back().back();
- faces_dates['F' - 'A'].front().back() = faces_dates['D' - 'A'].front().back();
- faces_dates['F' - 'A'].back().back() = faces_dates['D' - 'A'].back().back();
- faces_dates['R' - 'A'].front().back() = faces_dates['B' - 'A'].front().back();
- faces_dates['R' - 'A'].back().back() = faces_dates['B' - 'A'].back().back();
- faces_dates['B' - 'A'].front().back() = faces_dates['U' - 'A'].front().back();
- faces_dates['B' - 'A'].back().back() = faces_dates['U' - 'A'].back().back();
- faces_dates['U' - 'A'].front().back() = save_upper_right_F;
- faces_dates['U' - 'A'].back().back() = save_lower_right_F;
- RotateFaceForward('B');
- return;
- }
- if (face == 'U' || face == 'D') {
- RotateFaceForward('U');
- return;
- }
- }
- if (direction == BACK) {
- //передняя (F), левая (L), задняя (B), правая (R), верхняя (U) и нижняя (D)
- if (face == 'R' || face == 'L') {
- RotateFaceBack('R');
- return;
- }
- if (face == 'B' || face == 'F') {
- RotateFaceBack('B');
- return;
- }
- if (face == 'U' || face == 'D') {
- RotateFaceBack('U');
- return;
- }
- }
- }
- string GetValues() const {
- string values;
- for (const auto& face_date : faces_dates) {
- for (const auto& row : face_date) {
- for (char c : row) {
- values += c;
- }
- }
- }
- return values;
- }
- vector<vector<vector<char>>> faces_dates;
- };
- bool operator<(const RubiksCube& lhs, const RubiksCube& rhs) {
- return lhs.GetValues() < rhs.GetValues();
- }
- bool operator==(const RubiksCube& lhs, const RubiksCube& rhs) {
- return lhs.GetValues() == rhs.GetValues();
- }
- int main() {
- RubiksCube rubiks_cube;
- if (rubiks_cube.IsSolved()) {
- cout << "Solved";
- return 0;
- }
- map<RubiksCube, string> rubiks_cube_states_to_rotations;
- rubiks_cube_states_to_rotations[rubiks_cube];
- queue<RubiksCube> q;
- q.push(rubiks_cube);
- while (!q.empty()) {
- auto cur_cube = q.front();
- q.pop();
- if (cur_cube.IsSolved()) {
- cout << "Solved";
- return 0;
- }
- const vector<int> directions = { BACK, FORWARD };
- for (auto cube_face : FACES) {
- for (auto direction : directions) {
- auto cube = cur_cube;
- cube.DoRotate(cube_face, direction);
- if (rubiks_cube_states_to_rotations.count(cube) != 0) continue;
- string rotation = string{ cube_face };
- if (direction == BACK) rotation = "'" + rotation;
- rubiks_cube_states_to_rotations[cube] = rubiks_cube_states_to_rotations[cur_cube] + rotation;
- q.push(cube);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement