1 条题解

  • 0
    @ 2025-5-8 17:05:44

    题意分析

    题目要求编写一个程序,先读取包含变量列表和约束列表的输入,变量都是单个小写字母。根据这些约束(形如 x yx\ y 表示 x<yx < y),找出所有与约束一致的变量顺序,并按字典序输出。不同组约束规范的输出之间需要用空行分隔。输入以文件结束符结束。

    解题思路:

    1. 首先读取变量列表和约束列表。
    2. 生成所有可能的变量排列(可以使用全排列算法)。
    3. 对于每一种排列,检查它是否满足所有的约束条件。
    4. 如果满足约束条件,将该排列按要求格式输出。
    5. 处理下一组输入,直到输入结束(检测到文件结束符)。
    #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
    上传者