1 条题解
-
0
题意分析
题目要求编写一个程序,先读取包含变量列表和约束列表的输入,变量都是单个小写字母。根据这些约束(形如 表示 ),找出所有与约束一致的变量顺序,并按字典序输出。不同组约束规范的输出之间需要用空行分隔。输入以文件结束符结束。
解题思路:
- 首先读取变量列表和约束列表。
- 生成所有可能的变量排列(可以使用全排列算法)。
- 对于每一种排列,检查它是否满足所有的约束条件。
- 如果满足约束条件,将该排列按要求格式输出。
- 处理下一组输入,直到输入结束(检测到文件结束符)。
#include <iostream> #include <algorithm> #include <map> #include <cstdio> #include <cstring> #include <cctype> using namespace std; const int N = 200; int scnt, g[N][N], u, v, din[N]; char st[N], ans[N]; map<char, int> m; // 拓扑排序 void toposort(int n) { if(n == scnt) { ans[n] = '\0'; printf("%s\n", ans); } else { for(int i = 0; i < scnt; i++) if(din[i] == 0) { din[i]--; ans[n] = st[i]; for(int j = 0; j < scnt; j++) if(g[i][j]) din[j]--; toposort(n + 1); din[i]++; for(int j = 0; j < scnt; j++) if(g[i][j]) din[j]++; } } } int main() { string s; while(getline(cin, s)) { memset(g, 0, sizeof(g)); memset(din, 0, sizeof(din)); // 出入度 scnt = 0; for(int i = 0; s[i]; i++) if(islower(s[i])) st[scnt++] = s[i]; sort(st, st + scnt); for(int i = 0; i < scnt; i++) m[st[i]] = i; getline(cin, s); for(int i = 0, k = 0; s[i]; i++) if(islower(s[i])) { if(k % 2 == 0) u = s[i]; else { v = s[i]; g[m[u]][m[v]] = 1; din[m[v]]++; } k++; } toposort(0); printf("\n"); } return 0; }
- 1
信息
- ID
- 271
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者