전체 정렬 인쇄
void range(char a[], int k){
if(k==a.length-1){
System.out.println(Arrays.toString(a));
}
else {
for(int i=k;i
swap(a[i],a[k]);
range(a,k+1);
swap(a[k],a[i]);
}
}
창고를 빌려 위의 것을 비귀속으로 바꿀 수도 있다.
물론 다른 방법도 있다. 예를 들면
1. 사전 순서 방법.
Num[] 보조 배열을 사용하여 작성합니다.
void printRange(char a[]){
for(int i=0;i
num[i]=i;
}
while(hasNext(num)){
print(a,num);
moveNext(num);
}
------
예를 들어 abc가 대응하는 보조수조의 초기 상태는 012이고num이 210이 되면hasNext(num)는false이다.
어떻게 012에서 다음 것을 생성합니까?
예를 들어 124653, 우리는 그것의 다음 숫자열을 찾아야 한다. 사용하는 방법은
1. 오른쪽에서 왼쪽으로 스캔하여 위치를 찾습니다.num[pos]
그리고num[pos]와num[k]를 교환합니다.
2 다음에pos+1~n-1 위치의 문자를 교환합니다. 즉,reverse the substringfrompos+1~n-1 위치의 문자를 교환합니다.
또 다른 방법은 진법 증가법이라고 한다.
http://llfclz.itpub.net/post/1160/278490
n개의 숫자가 있다고 생각하면 먼저 첫 번째 숫자를 뽑아라.두 번째 숫자를 취하면 두 번째 숫자는 첫 번째 숫자의 왼쪽이나 오른쪽에 놓을 수 있다. 바로 0, 1 두 가지 선택이 있다.세 번째 수를 취하여 앞에서 선택한 두 숫자 중 가장 왼쪽, 중간, 가장 오른쪽에 놓을 수 있다. 바로 0, 1, 2, 세 가지 선택이 있다.응, 자연스러워.갑자기 너는 2진위, 8진위의 수계 전환 관계가 생각났다.이런 수를 설계할 수 있는데...xyz, 그 중에서 개수 z는 2진위, 즉 두 번째 수의 두 위치를 놓는다.10자리수 y는 3진위이고 세 번째 숫자를 넣은 세 자리를 대표한다. 그 다음에 백자리수는 4진위이고 천자리수는 5진위이다."맞아요. 이렇게 디자인하면 0이 맨 왼쪽에 놓는다는 뜻이라면'2021'이 수는 다섯 개의 원소(abcde)를 배열하고 하나를 취하고 두 번째 b를 a의 오른쪽에 놓으면 ab가 되고, c를 맨 오른쪽에 놓으면 abc가 되고, d를 맨 왼쪽에 놓으면dabc가 되고, 마지막으로 e를 가운데에 놓으면 daebc가 됩니다. 2021까지""이 특별한 디자인의 수는 2*5+0*4+2*3+1*2 같은 계산으로 자연수의 수열에 비칠 수 있다.
네 개의 수를 구하는 4!=24개의 배열, 18개의 배열은 이렇게 구할 수 있다. 18을 2로 나누면 나머지는 0이기 때문에 두 번째 수는 첫 번째 수의 왼쪽에 놓는다.그리고 상9에서 3, 나머지 0을 제외하면 세 번째는 첫 두 개의 수의 맨 왼쪽에 있다.마지막 3을 4로 나누면 나머지는 3이기 때문에 네 번째 수는 앞의 세 번째 수의 네 번째 빈자리, 즉 맨 오른쪽에 놓아야 한다.
1 import java.util.Arrays;
2 import java.util.Scanner;
3
4 /* A!
5 * Algorithm Description
6 *
7 *
8 */
9 public class Al2 {
10 private int factorial(int n){
11 int sum=1;
12 for(int i=1;i<=n;i++){
13 sum*=i;
14 }
15 return sum;
16 }
17 private void insert(int pos, char ch, char []cArr){
18 if(cArr[pos]!=' '){
19 for(int i=cArr.length-1;i>pos;i--){
20 cArr[i]=cArr[i-1];
21 }
22 cArr[pos]=ch;
23 } else{
24 cArr[pos]=ch;
25 }
26 }
27 private void solve(String str){
28 int n=str.length();
29 int m=factorial(n);
30 int []num=new int[n-1];
31 char []cArr=new char[n];
32 int i,j;
33 for(i=0;i){
34 Arrays.fill(cArr, ' ');
35 cArr[0]=str.charAt(0);
36 int c=i;
37 for(j=2;j<=n;j++){
38 num[j-2]=c%j;
39 c=c/j;
40 }
41 //System.out.print(Arrays.toString(num)+" ");
42 for(j=0;j){
43 insert(num[j],str.charAt(j+1),cArr);
44 }
45 //System.out.println("i="+(i+1)+": "+Arrays.toString(cArr));
46 }
47 }
48 public static void main(String args[]){
49 Scanner sc=new Scanner(System.in);
50 long startTime=System.currentTimeMillis();
51 new Al2().solve(sc.nextLine());
52 long endTime=System.currentTimeMillis();
53 System.out.println("Time cost: "+(endTime-startTime));
54 }
55 }
다음으로 전송:https://www.cnblogs.com/gaoqichao/archive/2012/07/19/2600001.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.