擅長排列的小明 (南陽oj 19)(1)
阿新 • • 發佈:2018-12-03
描述
小明十分聰明,而且十分擅長排列計算。比如給小明一個數字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
來源
上傳者
分析:這道題需要引用到 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; }