求4个数组成的全排列,第一个数字不能为0
思路:用字典序生成排列算法
代码如下
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class Main{
private StreamTokenizer cin;
private PrintWriter cout;
private static final boolean DEBUG = false;
private static final int N = 4;
private int[] nums = new int[N];
private void init()
{
try
{
if (DEBUG)
{
cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(new FileInputStream("d:\\program\\intelj\\spoj\\src\\spoj.txt"))));
}
else
{
cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
}
cout = new PrintWriter(System.out);
}
catch (IOException e)
{
e.printStackTrace();;
}
}
private Integer next()
{
try
{
cin.nextToken();
if (cin.ttype == StreamTokenizer.TT_EOF) return null;
else if (cin.ttype == StreamTokenizer.TT_NUMBER) return (int)cin.nval;
else return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
private boolean input()
{
Integer n = next();
if (n == null) return false;
nums[0] = n;
for (int i = 1; i < N; i++)
{
n = next();
nums[i] = n;
}
if (nums[0] == 0 && nums[1] == 0 && nums[2] == 0 && nums[3] == 0) return false;
return true;
}
private void findMinPermutation()
{
int Min = 10;
int j = 0;
for (int i = 0; i < N; i++)
{
if (nums[i] != 0 && nums[i] < Min)
{
Min = nums[i];
j = i;
}
}
if (j != 0)
{
int tmp = nums[0]; nums[0] = nums[j]; nums[j] = tmp;
Arrays.sort(nums, 1, N);
}
}
private void print()
{
for (int i = 0; i < N; i++)
{
cout.print(nums[i]);
}
}
private boolean nextPermutation()
{
int j = nums.length - 1;
j--;
while (!(j < 0 || nums[j] < nums[j + 1])) j--;
if (j < 0)
{
return false;
}
int i = nums.length - 1;
while (!(nums[j] < nums[i])) i--;
int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;
Arrays.sort(nums,j + 1, N);
return true;
}
private void solve()
{
findMinPermutation();
print();
int pre = nums[0];
while (nextPermutation())
{
int cur = nums[0];
if (pre != cur)
{
cout.println();
}
else
{
cout.print(" ");
}
print();
pre = cur;
}
cout.println();
cout.flush();
}
public void run() {
init();
int cas = 0;
while (input())
{
if (cas++ > 0) cout.println();
solve();
}
}
public static void main(String[] args)
{
new Main().run();
}
}