Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <vector>
- #include <fstream>
- #include <set>
- #include <map>
- #include <string>
- using std::cin;
- using std::cout;
- using std::vector;
- using std::string;
- int n, m;
- string reverse(const string& line, int& f_numb, int& sec_numb) { //функция, инвертирующая 2 заданных бита
- string refactored_line = line;
- if (refactored_line[f_numb] == '0') {
- refactored_line[f_numb] = '1';
- } else {
- refactored_line[f_numb] = '0';
- }
- if (f_numb != sec_numb) {
- if (refactored_line[sec_numb] == '0') {
- refactored_line[sec_numb] = '1';
- } else {
- refactored_line[sec_numb] = '0';
- }
- }
- return refactored_line;
- }
- void find_neighbours(const string& line, const std::set<string>& lines_list, //рекурсивная функция поиска соседей вершины
- std::map<string, bool>& used) { //функция не застрянет в рекурсии, т.к рано или поздно мы осмотрим все вершины
- used.at(line) = true;
- for (int i = 0; i < m; i++) {
- for (int j = i; j < m; j++) {
- auto iter_2 = lines_list.find(reverse(line, i, j)); //ищем соседа с расстоянием в 2 бита
- if (iter_2 != lines_list.end() && used[*iter_2] == false) {
- find_neighbours(*iter_2, lines_list, used); //если такой нашеся рекурсивно вызываем эту функцию от него
- }
- }
- }
- }
- int main() {
- std::ifstream fin("input_file.txt"); //считываем входной файл
- fin >> n >> m;
- std::set<string> lines_list; //множество наших строк
- std::map<string, bool> used; //будем хранить в map boolean, чтобы знать использовалась уже строка или нет
- for (int i = 0; i < n; i++) {
- std::string line;
- getline(fin, line);
- used.insert(std::make_pair(line, false));
- lines_list.insert(line);
- }
- int ClusterCounts = 0;
- for (auto line : lines_list) {
- if (used[line] == false) { //если вершина еще не посещалась, значит она принадлежит еще не посещенному кластеру
- ClusterCounts++;
- find_neighbours(line, lines_list, used); //найдем все остальные вершины этого кластера
- }
- }
- cout << ClusterCounts;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement