拓扑排序
#include #include #include #include #include #include #include #include #include #include using namespace std; int h, w; int all; char frame[40][40]; vector res; vector to[25]; map in; struct node { int lr = -1; int lc = -1; int rr = -1; int rc = -1; }; map mp; void inti() { in.clear(); res.clear(); mp.clear(); for (int i = 0; i < 25; i++) { to[i].clear(); } } void bulid() { for (int i = 1; i <= h; i++) { for (int j = 1; j <= w; j++) { if (frame[i][j] == '.') continue; int c = frame[i][j] - 'A'; if (mp.find(c) == mp.end()) { node d; mp[c] = d; } node nd = mp[c]; if (nd.lr == -1) { nd.lr = i; nd.lc = j; } else { if (nd.lr > i) { nd.lr = i; } if (nd.lc > j) { nd.lc = j; } } if (nd.rr == -1) { nd.rr = i; nd.rc = j; } else { if (nd.rr < i) { nd.rr = i; } if (nd.rc < j) { nd.rc = j; } } mp[c] = nd; } } map::iterator it = mp.begin(); for (; it != mp.end(); it++) { int c = it->first; node nd = it->second; int lr = nd.lr; int lc = nd.lc; int rr = nd.rr; int rc = nd.rc; map dir; //left for (int i = lr; i <= rr; i++) { int ch = frame[i][lc] - 'A'; if (c != ch) { if (dir.find(ch) == dir.end()) { dir[ch] = 1; to[c].push_back(ch); in[ch]++; } } } //up for (int i = lc; i <= rc; i++) { int ch = frame[lr][i] - 'A'; if (c != ch) { if (dir.find(ch) == dir.end()) { dir[ch] = 1; to[c].push_back(ch); in[ch]++; } } } //right for (int i = lr; i <= rr; i++) { int ch = frame[i][rc] - 'A'; if (c != ch) { if (dir.find(ch) == dir.end()) { dir[ch] = 1; to[c].push_back(ch); in[ch]++; } } } //down for (int i = lc; i <= rc; i++) { int ch = frame[rr][i] - 'A'; if (c != ch) { if (dir.find(ch) == dir.end()) { dir[ch] = 1; to[c].push_back(ch); in[ch]++; } } } } } void tpsort(vector cur, map newin, string ans) { sort(cur.begin(), cur.end()); if (cur.size() == 0) { res.push_back(ans); return; } map curin; for (int i = 1; i <= cur.size(); i++) { vector t = cur; int coun = 1; vector::iterator it = t.begin(); for (; it != t.end(); it++) { if (coun == i) { t.erase(it); break; } coun++; } curin = newin; vector des = to[cur[i - 1]]; for (int j = 0; j < des.size(); j++) { if (--curin[des[j]] == 0) { t.push_back(des[j]); } } string nans = ans; nans += 'A' + cur[i - 1]; tpsort(t, curin, nans); } } int main() { string str; while (scanf("%d%d", &h, &w) != EOF) { inti(); for (int i = 1; i <= h; i++) { cin >> str; for (int j = 0; j < str.length(); j++) { frame[i][j + 1] = str[j]; if (str[j] == '.') continue; int key = str[j] - 'A'; if (in.find(key) == in.end()) { in[key] = 0; } } } bulid(); vector v; map::iterator it = in.begin(); for (; it != in.end(); it++) { if (it->second == 0) { v.push_back(it->first); } } tpsort(v, in, ""); for (int i = 0; i < res.size(); i++) { cout << res[i] << endl; } } }
上一篇 JAVA基础
下一篇 python基本类型定义
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号