Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int inputValue(int min, int max);
- int userInputFromConsole();
- pair<short**, short**> userInputFromFile(string path);
- bool checkPath(string path);
- string userInputPath();
- int inputMethod();
- void printInConsole(bool flag);
- string userOutputPath();
- void printInFile(bool flag, string path);
- int outputMethod();
- void start();
- void printTask();
- int inputValue(int min, int max) {
- int currentValue;
- bool isNotValid = true;
- do {
- cin >> currentValue;
- if (currentValue >= min && currentValue <= max)
- isNotValid = false;
- else
- cout << "Введите число в заданном диапазоне\n";
- } while (isNotValid);
- return currentValue;
- }
- int userInputFromConsole() {
- const int MIN_SIZE = 2;
- const int MAX_SIZE = 10;
- int num;
- cout << "Введите порядок матрицы в диапазоне " << MIN_SIZE << ".." << MAX_SIZE << ": ";
- num = inputValue(MIN_SIZE, MAX_SIZE);
- return num;
- }
- short** userInputMatrixFromConsole(int num) {
- const int MIN_VALUE = 0;
- const int MAX_VALUE = 1;
- int value;
- cout << "Введите матрицу смежности" << endl;
- short** matrix = new short* [num];
- for (int i = 0; i < num; i++) {
- matrix[i] = new short[num];
- for (int j = 0; j < num; j++)
- matrix[i][j] = inputValue(MIN_VALUE, MAX_VALUE);
- }
- return matrix;
- }
- pair<short**, short**> userInputFromFile(string path) {
- int num, value;
- ifstream file(path);
- file.open(path);
- file.clear();
- file >> num;
- short** matrix1 = new short* [num];
- for (int i = 0; i < num; i++) {
- matrix1[i] = new short[num]();
- for (int j = 0; j < num; j++)
- file >> matrix1[i][j];
- }
- short** matrix2 = new short* [num];
- for (int i = 0; i < num; i++) {
- matrix2[i] = new short[num]();
- for (int j = 0; j < num; j++)
- file >> matrix2[i][j];
- }
- file.close();
- return make_pair(matrix1, matrix2);
- }
- bool checkPath(string path) {
- ifstream file(path);
- if (file.is_open()) {
- cout << path << " найден" << endl;
- return true;
- }
- else {
- cout << path << " не найден" << endl;
- return false;
- }
- }
- string userInputPath() {
- string path;
- bool isNotValid = false;
- do {
- cout << "Введите абсолютный путь к файлу с входными данными" << endl;
- cin >> path;
- } while (!checkPath(path));
- return path;
- }
- int inputMethod() {
- int method;
- cout << "Каким способом хотите ввести данные?" << endl;
- cout << "1 - с помощью консоли" << endl;
- cout << "2 - с помощью файла" << endl;
- do {
- cin >> method;
- if (method != 1 && method != 2)
- cout << "Введите 1 или 2" << endl;
- } while (method != 2 && method != 1);
- return method;
- }
- void printInConsole(bool flag) {
- if (flag)
- cout << "Графы изоморфны";
- else
- cout << "Графы не изоморфны";
- }
- string userOutputPath() {
- string path;
- cout << "Введите абсолютный путь к файлу для вывода результата" << endl;
- cin >> path;
- cout << "Результат работы помещён в файл";
- return path;
- }
- void printInFile(bool flag, string path) {
- ofstream file(path);
- if (flag)
- file << "Графы изоморфны";
- else
- file << "Графы не изоморфны";
- }
- int outputMethod() {
- int method;
- cout << "Куда хотите вывести результат?" << endl;
- cout << "1 - в консоль" << endl;
- cout << "2 - в файл" << endl;
- do {
- cin >> method;
- if (method != 1 && method != 2)
- cout << "Введите 1 или 2" << endl;
- } while (method != 2 && method != 1);
- return method;
- }
- pair<short**, short**> userInput() {
- int num;
- short** matrix1;
- short** matrix2;
- pair<short**, short**> matrixFile;
- short method = inputMethod();
- if (method == 1) {
- num = userInputFromConsole();
- matrix1 = userInputMatrixFromConsole(num);
- matrix2 = userInputMatrixFromConsole(num);
- return make_pair(matrix1, matrix2);
- }
- else {
- string path = userInputPath();
- matrixFile = userInputFromFile(path);
- return matrixFile;
- }
- }
- void printResult(bool flag) {
- short method = outputMethod();
- if (method == 1)
- printInConsole(flag);
- else {
- string path = userOutputPath();
- printInFile(flag, path);
- }
- }
- void printTask() {
- cout << "Данная программа проверяет два графа на изоморфность. Графы заданы матрицами смежности." << endl;
- }
- bool match(short** matrix1, short** matrix2, int n, short* p) {
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- if (matrix1[i][j] != matrix2[p[i]][p[j]])
- return false;
- return true;
- }
- void start() {
- printTask();
- pair<short**, short**> matrixPair = userInput();
- short** matrix1 = matrixPair.first;
- short** matrix2 = matrixPair.second;
- cout << endl;
- int n = _msize(matrix1) / sizeof(matrix1);
- short* p = new short[n];
- bool flag = false;
- for (int i = 0; i < n; i++)
- p[i] = i;
- do {
- if (match(matrix1, matrix2, n, p)) {
- flag = true;
- break;
- }
- } while (next_permutation(p, p + n));
- printResult(flag);
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- start();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement