Advertisement
Guest User

Untitled

a guest
May 21st, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int devRow(vector<vector<int> > &arr, vector<int> &d, int firstRow, int secondRow);
  9. int devCol(vector<vector<int> > &arr, vector<int> &d, int firstCol, int secondCol);
  10. bool delDevRows(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc);
  11. bool delDevCols(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName);
  12. void delDevs(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName);
  13. void findCov(vector<vector<int> > arr, vector<int> rc, vector<int> cc, vector<char> cName, int prevCol, int h, vector<char> &cov, vector<vector<char> > &res);
  14.  
  15. int main()
  16. {
  17. //ifstream in("input.txt");
  18. int n, m;
  19. cin >> n >> m;
  20. vector<vector<int> > arr(n);
  21.  
  22. for (int i = 0; i < n; i++)
  23. {
  24. arr[i].resize(m);
  25. for (int j = 0; j < m; j++)
  26. {
  27. cin >> arr[i][j];
  28. }
  29. }
  30. //in.close();
  31. vector<int> rc(n), cc(m);
  32. vector<char> cName(m);
  33. for (int i = 0; i < m; i++)
  34. cName[i] = 'a' + i;
  35. for (unsigned int i = 0; i < arr.size(); i++)
  36. for (unsigned int j = 0; j < arr[i].size(); j++)
  37. {
  38. rc[i] += arr[i][j];
  39. cc[j] += arr[i][j];
  40. }
  41.  
  42. delDevs(arr, rc, cc, cName);
  43.  
  44. vector<vector<char> > result;
  45. vector<char> cov;
  46. findCov(arr, rc, cc, cName, 0, 1, cov, result);
  47.  
  48.  
  49. for (unsigned int j = 0; j < result[result.size() - 1].size(); j++)
  50. cout << result[result.size() - 1][j] << " ";
  51. cout << endl;
  52.  
  53. return 0;
  54. }
  55.  
  56. // functions
  57.  
  58. int devRow(vector<vector<int> > &arr, vector<int> &d, int firstRow, int secondRow)
  59. {
  60. int i = (d[firstRow] < d[secondRow]) ? firstRow : secondRow,
  61. k = (i == firstRow) ? secondRow : firstRow;
  62. bool res = true;
  63. for (unsigned int j = 0; j < arr[i].size(); j++)
  64. if ((arr[i][j] == 1) && (arr[i][j] != arr[k][j]))
  65. return -1;
  66. return k;
  67. }
  68.  
  69. int devCol(vector<vector<int> > &arr, vector<int> &d, int firstCol, int secondCol)
  70. {
  71. int j = (d[firstCol] < d[secondCol]) ? firstCol : secondCol,
  72. k = (j == firstCol) ? secondCol : firstCol;
  73. bool res = true;
  74. for (unsigned int i = 0; i < arr.size(); i++)
  75. if ((arr[i][j] == 1) && (arr[i][j] != arr[i][k]))
  76. return -1;
  77. return j;
  78. }
  79.  
  80. bool delDevRows(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc)
  81. {
  82. bool res = false;
  83. for (unsigned int i = 0; i < arr.size(); i++)
  84. for (unsigned int k = i + 1; k < arr.size(); k++)
  85. {
  86. int row = devRow(arr, rc, i, k);
  87. if (row != -1)
  88. {
  89. for (unsigned int j = 0; j < arr[row].size(); j++)
  90. cc[j] -= arr[row][j];
  91. arr.erase(arr.begin() + row);
  92. rc.erase(rc.begin() + row);
  93. res = true;
  94. i--;
  95. break;
  96. }
  97. }
  98. return res;
  99. }
  100.  
  101. bool delDevCols(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName)
  102. {
  103. bool res = false;
  104. for (unsigned int j = 0; j < arr[0].size(); j++)
  105. for (unsigned int k = j + 1; k < arr[0].size(); k++)
  106. {
  107. int col = devCol(arr, cc, j, k);
  108. if (col != -1)
  109. {
  110. for (unsigned int i = 0; i < arr.size(); i++)
  111. rc[i] -= arr[i][col];
  112. for (unsigned int i = 0; i < arr.size(); i++)
  113. arr[i].erase(arr[i].begin() + col);
  114. cc.erase(cc.begin() + col);
  115. cName.erase(cName.begin() + col);
  116. res = true;
  117. j--;
  118. break;
  119. }
  120. }
  121. return res;
  122. }
  123.  
  124. void delDevs(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName)
  125. {
  126. do
  127. {
  128. delDevCols(arr, rc, cc, cName);
  129. } while (delDevRows(arr, rc, cc));
  130. }
  131.  
  132. void findCov(vector<vector<int> > arr, vector<int> rc, vector<int> cc, vector<char> cName, int prevCol, int h, vector<char> &cov, vector<vector<char> > &res)
  133. {
  134. if (!(res.empty()) && (h > res[res.size() - 1].size()))
  135. return;
  136.  
  137. if (!cov.empty())
  138. {
  139. for (int i = arr.size() - 1; i >= 0; i--)
  140. if (arr[i][prevCol] == 1)
  141. {
  142. for (int j = 0; j < arr[i].size(); j++)
  143. cc[j] -= arr[i][j];
  144. arr.erase(arr.begin() + i);
  145. rc.erase(rc.begin() + i);
  146. }
  147.  
  148. if (arr.empty())
  149. {
  150. res.push_back(cov);
  151. return;
  152. }
  153.  
  154. delDevs(arr, rc, cc, cName);
  155. }
  156.  
  157. int row = min_element(rc.begin(), rc.end()) - rc.begin();
  158.  
  159. vector<int> cols;
  160. for (int j = 0; j < arr[row].size(); j++)
  161. if (arr[row][j] == 1)
  162. cols.push_back(j);
  163.  
  164. for (int i = 0; i < cols.size(); i++)
  165. {
  166. cov.resize(h);
  167. cov[h - 1] = cName[cols[i]];
  168. findCov(arr, rc, cc, cName, cols[i], h + 1, cov, res);
  169. }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement