Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int devRow(vector<vector<int> > &arr, vector<int> &d, int firstRow, int secondRow);
- int devCol(vector<vector<int> > &arr, vector<int> &d, int firstCol, int secondCol);
- bool delDevRows(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc);
- bool delDevCols(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName);
- void delDevs(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName);
- 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);
- int main()
- {
- //ifstream in("input.txt");
- int n, m;
- cin >> n >> m;
- vector<vector<int> > arr(n);
- for (int i = 0; i < n; i++)
- {
- arr[i].resize(m);
- for (int j = 0; j < m; j++)
- {
- cin >> arr[i][j];
- }
- }
- //in.close();
- vector<int> rc(n), cc(m);
- vector<char> cName(m);
- for (int i = 0; i < m; i++)
- cName[i] = 'a' + i;
- for (unsigned int i = 0; i < arr.size(); i++)
- for (unsigned int j = 0; j < arr[i].size(); j++)
- {
- rc[i] += arr[i][j];
- cc[j] += arr[i][j];
- }
- delDevs(arr, rc, cc, cName);
- vector<vector<char> > result;
- vector<char> cov;
- findCov(arr, rc, cc, cName, 0, 1, cov, result);
- for (unsigned int j = 0; j < result[result.size() - 1].size(); j++)
- cout << result[result.size() - 1][j] << " ";
- cout << endl;
- return 0;
- }
- // functions
- int devRow(vector<vector<int> > &arr, vector<int> &d, int firstRow, int secondRow)
- {
- int i = (d[firstRow] < d[secondRow]) ? firstRow : secondRow,
- k = (i == firstRow) ? secondRow : firstRow;
- bool res = true;
- for (unsigned int j = 0; j < arr[i].size(); j++)
- if ((arr[i][j] == 1) && (arr[i][j] != arr[k][j]))
- return -1;
- return k;
- }
- int devCol(vector<vector<int> > &arr, vector<int> &d, int firstCol, int secondCol)
- {
- int j = (d[firstCol] < d[secondCol]) ? firstCol : secondCol,
- k = (j == firstCol) ? secondCol : firstCol;
- bool res = true;
- for (unsigned int i = 0; i < arr.size(); i++)
- if ((arr[i][j] == 1) && (arr[i][j] != arr[i][k]))
- return -1;
- return j;
- }
- bool delDevRows(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc)
- {
- bool res = false;
- for (unsigned int i = 0; i < arr.size(); i++)
- for (unsigned int k = i + 1; k < arr.size(); k++)
- {
- int row = devRow(arr, rc, i, k);
- if (row != -1)
- {
- for (unsigned int j = 0; j < arr[row].size(); j++)
- cc[j] -= arr[row][j];
- arr.erase(arr.begin() + row);
- rc.erase(rc.begin() + row);
- res = true;
- i--;
- break;
- }
- }
- return res;
- }
- bool delDevCols(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName)
- {
- bool res = false;
- for (unsigned int j = 0; j < arr[0].size(); j++)
- for (unsigned int k = j + 1; k < arr[0].size(); k++)
- {
- int col = devCol(arr, cc, j, k);
- if (col != -1)
- {
- for (unsigned int i = 0; i < arr.size(); i++)
- rc[i] -= arr[i][col];
- for (unsigned int i = 0; i < arr.size(); i++)
- arr[i].erase(arr[i].begin() + col);
- cc.erase(cc.begin() + col);
- cName.erase(cName.begin() + col);
- res = true;
- j--;
- break;
- }
- }
- return res;
- }
- void delDevs(vector<vector<int> > &arr, vector<int> &rc, vector<int> &cc, vector<char> &cName)
- {
- do
- {
- delDevCols(arr, rc, cc, cName);
- } while (delDevRows(arr, rc, cc));
- }
- 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)
- {
- if (!(res.empty()) && (h > res[res.size() - 1].size()))
- return;
- if (!cov.empty())
- {
- for (int i = arr.size() - 1; i >= 0; i--)
- if (arr[i][prevCol] == 1)
- {
- for (int j = 0; j < arr[i].size(); j++)
- cc[j] -= arr[i][j];
- arr.erase(arr.begin() + i);
- rc.erase(rc.begin() + i);
- }
- if (arr.empty())
- {
- res.push_back(cov);
- return;
- }
- delDevs(arr, rc, cc, cName);
- }
- int row = min_element(rc.begin(), rc.end()) - rc.begin();
- vector<int> cols;
- for (int j = 0; j < arr[row].size(); j++)
- if (arr[row][j] == 1)
- cols.push_back(j);
- for (int i = 0; i < cols.size(); i++)
- {
- cov.resize(h);
- cov[h - 1] = cName[cols[i]];
- findCov(arr, rc, cc, cName, cols[i], h + 1, cov, res);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement