Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.lang.reflect.Field;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.Scanner;
- class Cube {
- String top;
- String bottom;
- String left;
- String right;
- String front;
- String back;
- void rotate(int direction) {
- String tmp;
- switch (direction) {
- case 1:
- tmp = left;
- left = front;
- front = right;
- right = back;
- back = tmp;
- break;
- case 2:
- tmp = top;
- top = front;
- front = bottom;
- bottom = back;
- back = tmp;
- break;
- case 3:
- tmp = top;
- top = right;
- right = bottom;
- bottom = left;
- left = tmp;
- break;
- }
- }
- }
- public class Main {
- static Cube createCube(String top, String bottom, String left, String right, String front, String back) {
- Cube cube = new Cube();
- cube.top = top;
- cube.bottom = bottom;
- cube.left = left;
- cube.right = right;
- cube.front = front;
- cube.back = back;
- return cube;
- }
- static boolean allDistinct(ArrayList<String> arr) {
- HashSet<String> arr2 = new HashSet<>(arr);
- boolean result = arr2.size() == arr.size();
- return result;
- }
- static boolean validate(ArrayList<Cube> cubes) {
- ArrayList<String> frontArr = new ArrayList<>();
- ArrayList<String> topArr = new ArrayList<>();
- ArrayList<String> backArr = new ArrayList<>();
- ArrayList<String> bottomArr = new ArrayList<>();
- for (Cube cube : cubes) {
- frontArr.add(cube.front);
- topArr.add(cube.top);
- backArr.add(cube.back);
- bottomArr.add(cube.bottom);
- }
- boolean result = allDistinct(frontArr) && allDistinct(topArr) && allDistinct(backArr) && allDistinct(bottomArr);
- return result;
- }
- static void permute(ArrayList<Cube> cubes, int cubeNumber, int mistakes, int i, int j, int k) {
- ArrayList<Cube> subcubes = new ArrayList<>();
- for (int n = 0; n < cubeNumber; n++)
- subcubes.add(cubes.get(n));
- boolean stop = false;
- if (validate(subcubes)) {
- if (cubeNumber < 4)
- permute(cubes, cubeNumber + 1, mistakes, 0, 0, 0);
- } else {
- if (i < 5)
- cubes.get(cubeNumber - 1).rotate(1);
- else if (j < 5) {
- i = 0;
- cubes.get(cubeNumber - 1).rotate(2);
- j++;
- } else if (k < 5) {
- i = 0;
- j = 0;
- cubes.get(cubeNumber - 1).rotate(3);
- k++;
- } else {
- if (mistakes < 4) {
- mistakes++;
- cubes.get(0).rotate(2);
- } else {
- mistakes = 0;
- cubes.get(0).rotate(3);
- }
- permute(cubes, 2, mistakes, 0, 0, 0);
- stop = true;
- }
- if (!stop) {
- i++;
- permute(cubes, cubeNumber, mistakes, i, j, k);
- }
- }
- }
- static boolean isUserWantToSave(Scanner scan) {
- boolean notCorrect = true;
- String choice = "";
- System.out.println("Хотите сохранить результат в файл?");
- while(notCorrect) {
- System.out.println("Введите либо [д], либо [н]");
- choice = scan.nextLine();
- if(choice.equals("д") || choice.equals("н"))
- notCorrect = false;
- }
- return choice.equals("д");
- }
- static void saveResult(String res) {
- Scanner scan = new Scanner(System.in);
- if(isUserWantToSave(scan)) {
- System.out.println("Введите полное имя файла");
- String filePath = scan.nextLine();
- try(FileWriter fw = new FileWriter(filePath)) {
- fw.write(res);
- System.out.println("Результат успешно сохранен в файл.");
- } catch (IOException err) {
- System.out.println("Произошла ошибка при попытке сохранить данные в файл.");
- }
- }
- }
- static String getSolution(ArrayList<Cube> cubes) {
- int cubeNum = 1;
- String res = "";
- for(Cube cube : cubes) {
- res += "\nРешение для кубика №" + cubeNum + '\n';
- Field[] fields = cube.getClass().getDeclaredFields();
- try {
- for (Field field : fields) {
- field.setAccessible(true);
- String value = (String) field.get(cube);
- res += field.getName() + " = " + value + '\n';
- }
- cubeNum++;
- } catch (IllegalAccessException err) {
- System.out.println("Возникла ошибка при выводе решения для кубика №" + cubeNum);
- }
- }
- return res;
- }
- public static void main(String[] args) {
- System.out.println("Данная программа решает головоломку с кубиками, меняя стороны кубиков таким образом, чтобы они образовывали прямоугольную призму, каждая боковая грань которой раскрашена во все четыре цвета.");
- Cube cube1 = createCube("голубой", "красный", "зеленый", "зеленый", "белый", "голубой");
- Cube cube2 = createCube("зеленый", "красный", "красный", "красный", "белый", "голубой");
- Cube cube3 = createCube("зеленый", "красный", "белый", "голубой", "белый", "зеленый");
- Cube cube4 = createCube("белый", "зеленый", "красный", "голубой", "белый", "голубой");
- ArrayList<Cube> cubes = new ArrayList<>(Arrays.asList(cube1, cube2, cube3, cube4));
- int cubeNum = 2;
- int mistakes = 1;
- permute(cubes, cubeNum, mistakes, 0, 0, 0);
- String solution = getSolution(cubes);
- System.out.println(solution);
- saveResult(solution);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement