程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA110- Meta-Loopless Sorts(模擬全排列)

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

編輯:C++入門知識

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


題目鏈接


題意:給你n個數,要求按照題目所給的規則大小排序,輸出所有可能的結果。

思路:其實求出來的所有序列是n個數的全排列,那麼難點在於怎麼按照題目所給的格式輸出。我們可以看出其實是在已知的序列上插空,所以就可以使用回溯來插入元素,這裡可以使用vector,方便元素的插入。

#include 
#include 
#include 
#include 
#include 

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 &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 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 s;
        s.push_back('a');
        deal(1, s);
        printf("end.\n");
        if (cas)
            printf("\n"); 
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved