Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <fstream>
  5. #include <set>
  6. #include <map>
  7. #include <string>
  8.  
  9. using std::cin;
  10. using std::cout;
  11. using std::vector;
  12. using std::string;
  13.  
  14. int n, m;
  15.  
  16. string reverse(const string& line, int& f_numb, int& sec_numb) { //функция, инвертирующая 2 заданных бита
  17. string refactored_line = line;
  18. if (refactored_line[f_numb] == '0') {
  19. refactored_line[f_numb] = '1';
  20. } else {
  21. refactored_line[f_numb] = '0';
  22. }
  23. if (f_numb != sec_numb) {
  24. if (refactored_line[sec_numb] == '0') {
  25. refactored_line[sec_numb] = '1';
  26. } else {
  27. refactored_line[sec_numb] = '0';
  28. }
  29. }
  30.  
  31. return refactored_line;
  32. }
  33.  
  34. void find_neighbours(const string& line, const std::set<string>& lines_list, //рекурсивная функция поиска соседей вершины
  35. std::map<string, bool>& used) { //функция не застрянет в рекурсии, т.к рано или поздно мы осмотрим все вершины
  36. used.at(line) = true;
  37. for (int i = 0; i < m; i++) {
  38. for (int j = i; j < m; j++) {
  39. auto iter_2 = lines_list.find(reverse(line, i, j)); //ищем соседа с расстоянием в 2 бита
  40. if (iter_2 != lines_list.end() && used[*iter_2] == false) {
  41. find_neighbours(*iter_2, lines_list, used); //если такой нашеся рекурсивно вызываем эту функцию от него
  42. }
  43. }
  44. }
  45. }
  46.  
  47. int main() {
  48. std::ifstream fin("input_file.txt"); //считываем входной файл
  49. fin >> n >> m;
  50. std::set<string> lines_list; //множество наших строк
  51. std::map<string, bool> used; //будем хранить в map boolean, чтобы знать использовалась уже строка или нет
  52. for (int i = 0; i < n; i++) {
  53. std::string line;
  54. getline(fin, line);
  55. used.insert(std::make_pair(line, false));
  56. lines_list.insert(line);
  57. }
  58. int ClusterCounts = 0;
  59. for (auto line : lines_list) {
  60. if (used[line] == false) { //если вершина еще не посещалась, значит она принадлежит еще не посещенному кластеру
  61. ClusterCounts++;
  62. find_neighbours(line, lines_list, used); //найдем все остальные вершины этого кластера
  63. }
  64. }
  65. cout << ClusterCounts;
  66. system("pause");
  67. return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement