習(xí)題筆記:全排列問(wèn)題(洛谷1706)拓巧;
題目:
題目描述
按照字典序輸出自然數(shù) 11 到 nn 所有不重復(fù)的排列猾骡,即 nn 的全排列萨蚕,要求所產(chǎn)生的任一數(shù)字序列中不允許出現(xiàn)重復(fù)的數(shù)字酱虎。
輸入格式
一個(gè)整數(shù) nn。
輸出格式
由 1 \sim n1~n 組成的所有不重復(fù)的數(shù)字序列松蒜,每行一個(gè)序列扔茅。
每個(gè)數(shù)字保留 55 個(gè)場(chǎng)寬。
輸入輸出樣例
輸入 #1
3
輸出 #1
? ? 1? ? 2? ? 3
? ? 1? ? 3? ? 2
? ? 2? ? 1? ? 3
? ? 2? ? 3? ? 1
? ? 3? ? 1? ? 2
? ? 3? ? 2? ? 1
(n>=1&&n<=9);
解析:
先定義一些值(全局變量):
public class{ static int n;
static boolean[] isUsed = new boolean[10];//用來(lái)判斷相應(yīng)數(shù)字有沒(méi)有被使用過(guò)
static int[] res = new int[10]; //用來(lái)存儲(chǔ)結(jié)果
}
輸入數(shù)值: public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a(0);
}
定義一個(gè)方法:
public static void a(int now) {//now代表現(xiàn)在res數(shù)組里有幾個(gè)數(shù)字,也可以理解為當(dāng)前索引
if (now == n ) {//當(dāng)now == n 時(shí),就說(shuō)明已經(jīng)滿了,直接輸出即可
print();
return;
}
判斷:
for (int i = 0; i < n; i++) {
if (!isUsed[i]) {//判斷是否被用過(guò)
isUsed[i] = true;//既然進(jìn)來(lái)了秸苗,就設(shè)為使用過(guò)了
res[now] = i + 1;//因?yàn)閚是1-9召娜,所有i+1
a(now+1);//加入后now+1
//最后回溯是對(duì)isUsed[i]回溯;如果寫(xiě)成isUsed[now]的話
//由于每次回溯時(shí)now==n,所以寫(xiě)成isUsed[now]的話其實(shí)每次就只把最后一個(gè)數(shù)置為false
isUsed[i] = false;//回溯
}
輸出:
//輸出
public static void print() {
for (int i = 0; i < n; i++) {
System.out.print(" "+res[i]);
}
System.out.println();
}