1. 程式人生 > >擅長排列的小明 (南陽oj 19)(1)

擅長排列的小明 (南陽oj 19)(1)

描述

小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的很擅長。現在需要你寫一個程式來驗證擅長排列的小明到底對不對。

輸入

第一行輸入整數N(1<N<10)表示多少組測試資料,
每組測試資料第一行兩個整數 n m (1<n<9,0<m<=n)

輸出

在1-n中選取m個字元進行全排列,按字典序全部輸出,每種排列佔一行,每組資料間不需分界。如樣例

樣例輸入

2
3 1
4 2

樣例輸出

1
2
3
12
13
14
21
23
24
31
32
34
41
42
43

來源

[hzyqazasdf]原創

上傳者

hzyqazasdf

分析:這道題需要引用到 substr函式

substr函式(轉):

SUBSTR(str,pos,len): 從pos開始的位置,擷取len個字元
substr(string ,1,3) :取string左邊第1位置起,3字長的字串。 
所以結果為: str
substr(string, -1,3):取string右邊第1位置起,3字長的字串。顯然右邊第一位置起往右不夠3字長。
結果只能是: g
substr(string, -3,3):取string右邊第3位置起,3字長的字串。 
結果為: ing
SUBSTR(str,pos): pos開始的位置,一直擷取到最後
substr(string ,4) : 從右第4位置擷取到最後 
結果是: ing

原文連結:https://blog.csdn.net/u012973218/article/details/71374314

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
    int N, n, m;
	scanf("%d",&N);
	while(N--)
    {
		scanf("%d %d",&n,&m);
		string s1,s2;
		for (int i = 1; i <= n; i++)
        {
            s1+= '0' + i;//將i轉化成ASCII碼錶的形式
        }
		s2 = s1.substr(0, m);//擷取s1從0位置開始,m長的字串
		cout << s2 << endl;
		while(next_permutation(s1.begin(), s1.end()))
        {
			if (s2 != s1.substr(0, m))
            {
                s2 = s1.substr(0, m);
				cout << s2 << endl;
            }
        }
    }
	return 0;
}