洛谷 P1706 全排列問題Java
阿新 • • 發佈:2021-02-02
洛谷 P1706 全排列問題
題目描述
輸出自然數 1 到 nn 所有不重複的排列,即 n 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。
輸入格式
一個整數 n。
輸出格式
由1∼n 組成的所有不重複的數字序列,每行一個序列。
每個數字保留 5 個場寬。
輸入輸出樣例
輸入
3
輸出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
解題思路
此題目是一個簡單的字典序
對於Java使用者來說,需要注意的是對於輸出的處理。本人一開始使用PrintWrite快速輸出(其實也不算太快),但是奈何該輸出方式太吃記憶體,因此在125MB的記憶體限制下根本不夠用,因此嘗試使用字串來快取結果,成功AC。
程式碼描述
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[] res;
static short[] visited;
static PrintWriter pr;
static StringBuilder printTemp;
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
PrintWriter pr=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
n=sc.nextInt();
res=new int[n];
visited=new short[10];
printTemp=new StringBuilder();
BackTrack(0);
pr. print(printTemp);
pr.flush();
return;
}
static void BackTrack(int index) {
if(index==n) {
//開始快取結果
for(int i=0;i<n;i++) {
printTemp.append(" "+res[i]);
}
printTemp.append("\n"); //回車
return;
}
for(int i=1;i<=n;i++) {
if(visited[i]==1) continue;
visited[i]=1;
res[index]=i;
BackTrack(index+1);
visited[i]=0;
}
return;
}
}
另外一種輸出方式
之後,本人經過測試原來PrintWrite吃記憶體是輸出格式的原因。
本人之前的輸出格式(很吃記憶體):
for(int i=0;i<n;i++) {
pr.print(String.format("%5d", res[i]));
}
pr.println(); //回車
改完之後便可以AC了:
for(int i=0;i<n;i++) {
pr.print(" "+res[i]);
}
pr.println(); //回車
另一種程式碼
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[] res;
static short[] visited;
static PrintWriter pr;
static StringBuilder printTemp;
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
pr=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
n=sc.nextInt();
res=new int[n];
visited=new short[10];
printTemp=new StringBuilder();
BackTrack(0);
pr.flush();
return;
}
static void BackTrack(int index) {
if(index==n) {
//輸出
for(int i=0;i<n;i++) {
pr.print(" "+res[i]);
}
pr.println(); //回車
return;
}
for(int i=1;i<=n;i++) {
if(visited[i]==1) continue;
visited[i]=1;
res[index]=i;
BackTrack(index+1);
visited[i]=0;
}
return;
}
}