1. 程式人生 > 其它 >洛谷 P1706 全排列問題Java

洛谷 P1706 全排列問題Java

技術標籤:洛谷Java解法java回溯法洛谷

洛谷 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;
	}
}