#include<cstdio>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
void permutation(char *str,int length)
{
sort(str,str+length);
do{
for(int i = 0; i<length;++i)
cout<<str[i];
cout<<endl;
}while(next_permutation(str,str+length));
}
int main()
{
char str[] = "abcdef";
permutation(str,6); //字符串多长就写多少
}
Java全排列应用:
凑算式
B DEF
A + --- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。(比赛时,题目有改动)
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
public class Main{
static int count = 0;
static void swap(char array[], int a, int b) {
char temp = array[a];
array[a] = array[b];
array[b] = temp;
}
static boolean check(char[] str){
double[] num = new double[10];
for(int i = 0; i < 9; ++i)
num[i] = str[i]-'0';
if(num[0]+num[1]*1.0/num[2]+(num[3]*100+num[4]*10+num[5])*1.0/(num[6]*100+num[7]*10+num[8]) == 10)
return true;
return false;
}
static void permutation(char[] str, int a, int length){
if(a == length){
if(check(str)){
++count;
System.out.println(String.valueOf(str));
}
}else{
for(int i = a; i <= length; ++i){
swap(str, i, a);
permutation(str, a + 1, length);
swap(str, i, a);
}
}
}
public static void main(String[] args) {
char[] str = "123456789".toCharArray();
permutation(str, 0, 8);
System.out.println(count);
}
}
递归写法:
import java.util.List;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.Vector;
public class Main{
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
List lst = f("ABCD");
for(int i=0;i<lst.size();++i){
System.out.println(lst.get(i));
}
}
static List f(String s){
List lst = new Vector();
if(s.length()==1){
lst.add(s);
return lst;
}
for(int i=0;i<s.length();++i){
char x = s.charAt(i);
List t = f(s.substring(0,i)+s.substring(i+1));
for(int k=0;k<t.size();++k){
lst.add(""+x+t.get(k));
}
}
return lst;
}
}
数组写法:
import java.util.Arrays;
public class Main{
public static void main(String[] args) {
f("ABC".toCharArray(),0);
}
//k:考虑的当前位置
static void f(char []aa,int k){
if(k==aa.length-1){
System.out.println(String.valueOf(aa));
return ;
}
for(int i=k;i<aa.length;++i){
{char t = aa[k]; aa[k] = aa[i]; aa[i] = t;}//试探
f(aa,k+1);
{char t = aa[k]; aa[k] = aa[i]; aa[i] = t;}//回溯
}
}
}