首页 > 代码库 > UVA110- Meta-Loopless Sorts(模拟全排列)

UVA110- Meta-Loopless Sorts(模拟全排列)

题目链接


题意:给你n个数,要求按照题目所给的规则大小排序,输出所有可能的结果。

思路:其实求出来的所有序列是n个数的全排列,那么难点在于怎么按照题目所给的格式输出。我们可以看出其实是在已知的序列上插空,所以就可以使用回溯来插入元素,这里可以使用vector,方便元素的插入。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 10;

char str[MAXN];
int n;

void space(int cnt) {
    for(int i = 0; i < cnt; i++)  
        printf("  ");  
}

void deal(int cur, vector<char> &s) {
    if (cur == n) {
        space(n);
        printf("writeln("); 
        printf("%c", s[0]);
        for (int i = 1; i < n; i++) 
            printf(",%c", s[i]);
        printf(")\n");
        return;
    }
    else {
        for (int i = cur; i >= 0; i--) {
            space(cur);
            if (i < cur) 
                printf("else ");
            if (i)
                printf("if %c < %c then", s[i - 1], cur + 'a');
            printf("\n"); 
            vector<char> ss(s); 
            ss.insert(ss.begin() + i, 'a' + cur);
            deal(cur + 1, ss);
        }  
    }  
}

int main() {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &n);     
        for (int i = 0; i < n; i++)
            str[i] = 'a' + i;
        printf("program sort(input,output);\nvar\n");
        printf("%c", str[0]);
        for (int i = 1; i < n; i++)
            printf(",%c", str[i]);
        printf(" : integer;\nbegin\n");
        printf("  readln(%c", str[0]);
        for (int i = 1; i < n; i++)
            printf(",%c", str[i]);
        printf(");\n");
        vector<char> s;
        s.push_back('a');
        deal(1, s);
        printf("end.\n");
        if (cas)
            printf("\n"); 
    }
    return 0;
}