刚写了个求数字组合的程序,
比如
Please input the number:
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
TotalCount is :6
Please input the number:
4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
TotalCount is :24
即每一行任意数字都不相等,感觉写得较勉强,算法不太好,用递归写的。请各位给个比较好的算法?下面是我的代码,用java写的。import java.util.Scanner;public class Myarrange { public class Arrint {
int num;// 需进行排列组合的元素。 boolean bool;// 当前元素是否被使用。 Arrint(int k) {
num = k;
bool = false;
}
} public class workItem {
int num; // 当前存储的数字 boolean bool; // 当前数据是否是有效的 workItem(int k) {
num = k;
bool = false;
}
} int TotalCount = 0;// 组合的总数 boolean isFirstline = true; Arrint[] arrint;// 需要进行组合的数据,初始化在构造函数中完成。 int count = 0;// 计数器,用于处理第一行数据的处理,因为第一行数据的处理规则和其它行有所不同。 workItem[] work; public Myarrange(int k) {
arrint = new Arrint[k + 1];
work = new workItem[k + 1];
for (int i = 0; i < arrint.length; i++) {
arrint[i] = new Arrint(i);
work[i] = new workItem(0);
}
} boolean check(Arrint[] arr) {
for (int i = 1; i <= arr.length - 1; i++) {
if (arr[i].bool == false) {
return false;
}
}
return true;
} int minCanused() {
for (int i = 1; i < arrint.length; i++) {
if (arrint[i].bool == false)
return arrint[i].num;
}
return 0;
} int maxCanused() {
for (int i = arrint.length - 1; i > 0; i--) {
if (arrint[i].bool == false) {
return arrint[i].num;
}
}
return 0;
} int minNotlessthanCanused(int k) {
for (int i = 1; i < arrint.length; i++) {
if (arrint[i].bool == false && arrint[i].num > k)
return arrint[i].num;
}
return 0;
} void comb(int level, int k) {
int temp;
while (true) {
if (isFirstline == true) {
count++;
work[level].num = minCanused();
work[level].bool = true;
arrint[work[level].num].bool = true;
} else if ((temp = minNotlessthanCanused(work[level].num)) != 0
&& work[level].bool == true) {
arrint[temp].bool = true;
arrint[work[level].num].bool = false;
work[level].num = temp;
work[level].bool = true;
} else {
work[level].num = minCanused();
work[level].bool = true;
arrint[work[level].num].bool = true;
}
if (check(arrint)) {
TotalCount++;
print(work);
} else {
comb(level + 1, k);
}
if (level == k) {// 当到达一行最后一个元素时,回退至上层
arrint[work[level].num].bool = false;// 将当前层的工作数组中的元素状态置成未使用状态
work[level].bool = false; // 将当前工作数组中的数据元素置为无效数据
if (count == k)
isFirstline = false;// 如果第一行已经输出完毕,将状态标置置为false;
break;
}
if (work[level].num < maxCanused()) {// 如果当前元素比可用数字中的最大数字小的话那么在可用数字中重新挑选一个作为当前数字。
continue;
} else {
arrint[work[level].num].bool = false;
work[level].bool = false;
break;
}
}
} void print(workItem[] a) {
for (int i = 1; i < a.length; i++) {
System.out.printf("%6d", a[i].num);
}
System.out.println();
} public static void main(String[] args) {
System.out.println("Please input the number:");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Myarrange Myarr = new Myarrange(i);
// Myarr.printFirstline(i);
Myarr.comb(1, i);
System.out.println("TotalCount is :" + Myarr.TotalCount);
}}
比如
Please input the number:
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
TotalCount is :6
Please input the number:
4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
TotalCount is :24
即每一行任意数字都不相等,感觉写得较勉强,算法不太好,用递归写的。请各位给个比较好的算法?下面是我的代码,用java写的。import java.util.Scanner;public class Myarrange { public class Arrint {
int num;// 需进行排列组合的元素。 boolean bool;// 当前元素是否被使用。 Arrint(int k) {
num = k;
bool = false;
}
} public class workItem {
int num; // 当前存储的数字 boolean bool; // 当前数据是否是有效的 workItem(int k) {
num = k;
bool = false;
}
} int TotalCount = 0;// 组合的总数 boolean isFirstline = true; Arrint[] arrint;// 需要进行组合的数据,初始化在构造函数中完成。 int count = 0;// 计数器,用于处理第一行数据的处理,因为第一行数据的处理规则和其它行有所不同。 workItem[] work; public Myarrange(int k) {
arrint = new Arrint[k + 1];
work = new workItem[k + 1];
for (int i = 0; i < arrint.length; i++) {
arrint[i] = new Arrint(i);
work[i] = new workItem(0);
}
} boolean check(Arrint[] arr) {
for (int i = 1; i <= arr.length - 1; i++) {
if (arr[i].bool == false) {
return false;
}
}
return true;
} int minCanused() {
for (int i = 1; i < arrint.length; i++) {
if (arrint[i].bool == false)
return arrint[i].num;
}
return 0;
} int maxCanused() {
for (int i = arrint.length - 1; i > 0; i--) {
if (arrint[i].bool == false) {
return arrint[i].num;
}
}
return 0;
} int minNotlessthanCanused(int k) {
for (int i = 1; i < arrint.length; i++) {
if (arrint[i].bool == false && arrint[i].num > k)
return arrint[i].num;
}
return 0;
} void comb(int level, int k) {
int temp;
while (true) {
if (isFirstline == true) {
count++;
work[level].num = minCanused();
work[level].bool = true;
arrint[work[level].num].bool = true;
} else if ((temp = minNotlessthanCanused(work[level].num)) != 0
&& work[level].bool == true) {
arrint[temp].bool = true;
arrint[work[level].num].bool = false;
work[level].num = temp;
work[level].bool = true;
} else {
work[level].num = minCanused();
work[level].bool = true;
arrint[work[level].num].bool = true;
}
if (check(arrint)) {
TotalCount++;
print(work);
} else {
comb(level + 1, k);
}
if (level == k) {// 当到达一行最后一个元素时,回退至上层
arrint[work[level].num].bool = false;// 将当前层的工作数组中的元素状态置成未使用状态
work[level].bool = false; // 将当前工作数组中的数据元素置为无效数据
if (count == k)
isFirstline = false;// 如果第一行已经输出完毕,将状态标置置为false;
break;
}
if (work[level].num < maxCanused()) {// 如果当前元素比可用数字中的最大数字小的话那么在可用数字中重新挑选一个作为当前数字。
continue;
} else {
arrint[work[level].num].bool = false;
work[level].bool = false;
break;
}
}
} void print(workItem[] a) {
for (int i = 1; i < a.length; i++) {
System.out.printf("%6d", a[i].num);
}
System.out.println();
} public static void main(String[] args) {
System.out.println("Please input the number:");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Myarrange Myarr = new Myarrange(i);
// Myarr.printFirstline(i);
Myarr.comb(1, i);
System.out.println("TotalCount is :" + Myarr.TotalCount);
}}
解决方案 »
- dom4j解析xml每修改一次增加一个空行,是什么原因,如何解决?
- 如何用java结束一个java.exe进程?
- 急~~~objectInputStream 的writeObject()问题
- 用swing做的界面,JLabel里面放的是时间,怎么才能让它实时的更新啊?
- 你们的JDK文档是怎样的,怎么那里那连个例子都没有
- 求Visual Paradigm For UML Professional的license
- 我是新手,请多多关照!
- 为什么我做的JSplitPane拖到一定程度就不能再拖动了?
- 关于JBuilder6的简单问题,请大家帮帮忙!
- B2B和B2C是指的什么?
- 用JTextPane编辑html怎么插入空格
- 求孙卫琴的<tomcat与java web开发技术详解> 源码
public class test{
ArrayList list = new ArrayList();
test(String in){
for(int i=0;i<in.length();i++)
list.add(in.substring(i,i+1));
printList(0,list);
}
ArrayList replaceStr(ArrayList s,int c1,int c2){
s.add(c1,s.get(c2));
s.remove(c2+1);
return s;
}
void printList(int start,ArrayList temparr){
if(start==list.size()-1)
for(int i=0;i<temparr.size();i++)
System.out.print(temparr.get(i)+(i==temparr.size()-1?" ":""));
else
for(int i=start;i<list.size();i++)
printList(start+1,replaceStr(new ArrayList(temparr),start,i));
}
public static void main(String args[]){
if(args.length==0)
new test("2468");
else
new test(args[0]);
}
}
import java.util.*;
public class test{
ArrayList list = new ArrayList();
test(String in){
int temp = Integer.parseInt(in);
for(int i=0;i<temp;i++)
list.add(String.valueOf(i+1));
printList(0,list);
}
ArrayList replaceStr(ArrayList s,int c1,int c2){
s.add(c1,s.get(c2));
s.remove(c2+1);
return s;
}
void printList(int start,ArrayList temparr){
if(start==list.size()-1)
for(int i=0;i<temparr.size();i++)
System.out.print(temparr.get(i)+(i==temparr.size()-1?" ":","));
else
for(int i=start;i<list.size();i++)
printList(start+1,replaceStr(new ArrayList(temparr),start,i));
}
public static void main(String args[]){
new test(args[0]);
}
}
String[] list;
StringBuffer sb = new StringBuffer();
test(String in){
int temp = Integer.parseInt(in);
list = new String[temp];
for(int i=0;i<temp;i++)
list[i] = String.valueOf(i+1);
printList(0,list);
System.out.println(sb);
}
String[] replaceStr(String[] s,int c1,int c2){
int temp = c1;
c1 = c2;
c2 = temp;
return s;
}
void printList(int start,String[] temparr){
if(start==list.length-1)
for(int i=0;i<temparr.length;i++)
sb.append(temparr[i]+(i==temparr.length-1?" ":""));
else
for(int i=start;i<list.length;i++)
printList(start+1,replaceStr(temparr.clone(),start,i));
}
public static void main(String args[]){
new test(args[0]);
}
}改进了一下,在输入6的情况下
阁下的算法大概要2000毫秒
我原来的算法大概要700毫秒
用stringBuffer优化一下之后,大概要用70毫秒
再改用数组实现后大概要用60毫秒
public class test{
String[] list;
StringBuffer sb = new StringBuffer();
test(String in){
int temp = Integer.parseInt(in);
list = new String[temp];
for(int i=0;i<temp;i++)
list[i] = String.valueOf(i+1);
printList(0,list);
System.out.println(sb);
}
String[] replaceStr(String[] s,int c1,int c2){
String temp = s[c1];
s[c1] = s[c2];
s[c2] = temp;
return s;
}
void printList(int start,String[] temparr){
if(start==list.length-1)
for(int i=0;i<temparr.length;i++)
sb.append(temparr[i]+(i==temparr.length-1?" ":""));
else
for(int i=start;i<list.length;i++)
printList(start+1,replaceStr(temparr.clone(),start,i));
}
public static void main(String args[]){
long t1 = System.currentTimeMillis();
new test(args[0]);
System.out.println(System.currentTimeMillis()-t1);
}
}但是,用了stringbuffer之后,需要大量内存,所以不可行再改回使用print输出
public class test{
String[] list;
test(String in){
int temp = Integer.parseInt(in);
list = new String[temp];
for(int i=0;i<temp;i++)
list[i] = String.valueOf(i+1);
printList(0,list);
}
String[] replaceStr(String[] s,int c1,int c2){
String temp = s[c1];
s[c1] = s[c2];
s[c2] = temp;
return s;
}
void printList(int start,String[] temparr){
if(start==list.length-1)
for(int i=0;i<temparr.length;i++)
System.out.print(temparr[i]+(i==temparr.length-1?" ":""));
else
for(int i=start;i<list.length;i++)
printList(start+1,replaceStr(temparr.clone(),start,i));
}
public static void main(String args[]){
new test(args[0]);
}
}
用时400毫秒,不受内存的限制
123456 123465 123546 123564 123654 123645 124356 124365 124536 124563 124653 124
635 125436 125463 125346 125364 125634 125643 126453 126435 126543 126534 126354
126345 132456 132465 132546 132564 132654 132645 134256 134265 134526 134562 13
4652 134625 135426 135462 135246 135264 135624 135642 136452 136425 136542 13652
4 136254 136245 143256 143265 143526 143562 143652 143625 142356 142365 142536 1
42563 142653 142635 145236 145263 145326 145362 145632 145623 146253 146235 1465
23 146532 146352 146325 153426 153462 153246 153264 153624 153642 154326 154362
154236 154263 154623 154632 152436 152463 152346 152364 152634 152643 156423 156
432 156243 156234 156324 156342 163452 163425 163542 163524 163254 163245 164352
164325 164532 164523 164253 164235 165432 165423 165342 165324 165234 165243 16
2453 162435 162543 162534 162354 162345 213456 213465 213546 213564 213654 21364
5 214356 214365 214536 214563 214653 214635 215436 215463 215346 215364 215634 2
15643 216453 216435 216543 216534 216354 216345 231456 231465 231546 231564 2316
54 231645 234156 234165 234516 234561 234651 234615 235416 235461 235146 235164
235614 235641 236451 236415 236541 236514 236154 236145 243156 243165 243516 243
561 243651 243615 241356 241365 241536 241563 241653 241635 245136 245163 245316
245361 245631 245613 246153 246135 246513 246531 246351 246315 253416 253461 25
3146 253164 253614 253641 254316 254361 254136 254163 254613 254631 251436 25146
3 251346 251364 251634 251643 256413 256431 256143 256134 256314 256341 263451 2
63415 263541 263514 263154 263145 264351 264315 264531 264513 264153 264135 2654
31 265413 265341 265314 265134 265143 261453 261435 261543 261534 261354 261345
321456 321465 321546 321564 321654 321645 324156 324165 324516 324561 324651 324
615 325416 325461 325146 325164 325614 325641 326451 326415 326541 326514 326154
326145 312456 312465 312546 312564 312654 312645 314256 314265 314526 314562 31
4652 314625 315426 315462 315246 315264 315624 315642 316452 316425 316542 31652
4 316254 316245 341256 341265 341526 341562 341652 341625 342156 342165 342516 3
42561 342651 342615 345216 345261 345126 345162 345612 345621 346251 346215 3465
21 346512 346152 346125 351426 351462 351246 351264 351624 351642 354126 354162
354216 354261 354621 354612 352416 352461 352146 352164 352614 352641 356421 356
412 356241 356214 356124 356142 361452 361425 361542 361524 361254 361245 364152
364125 364512 364521 364251 364215 365412 365421 365142 365124 365214 365241 36
2451 362415 362541 362514 362154 362145 423156 423165 423516 423561 423651 42361
5 421356 421365 421536 421563 421653 421635 425136 425163 425316 425361 425631 4
25613 426153 426135 426513 426531 426351 426315 432156 432165 432516 432561 4326
51 432615 431256 431265 431526 431562 431652 431625 435126 435162 435216 435261
435621 435612 436152 436125 436512 436521 436251 436215 413256 413265 413526 413
562 413652 413625 412356 412365 412536 412563 412653 412635 415236 415263 415326
415362 415632 415623 416253 416235 416523 416532 416352 416325 453126 453162 45
3216 453261 453621 453612 451326 451362 451236 451263 451623 451632 452136 45216
3 452316 452361 452631 452613 456123 456132 456213 456231 456321 456312 463152 4
63125 463512 463521 463251 463215 461352 461325 461532 461523 461253 461235 4651
32 465123 465312 465321 465231 465213 462153 462135 462513 462531 462351 462315
523416 523461 523146 523164 523614 523641 524316 524361 524136 524163 524613 524
631 521436 521463 521346 521364 521634 521643 526413 526431 526143 526134 526314
526341 532416 532461 532146 532164 532614 532641 534216 534261 534126 534162 53
4612 534621 531426 531462 531246 531264 531624 531642 536412 536421 536142 53612
4 536214 536241 543216 543261 543126 543162 543612 543621 542316 542361 542136 5
42163 542613 542631 541236 541263 541326 541362 541632 541623 546213 546231 5461
23 546132 546312 546321 513426 513462 513246 513264 513624 513642 514326 514362
514236 514263 514623 514632 512436 512463 512346 512364 512634 512643 516423 516
432 516243 516234 516324 516342 563412 563421 563142 563124 563214 563241 564312
564321 564132 564123 564213 564231 561432 561423 561342 561324 561234 561243 56
2413 562431 562143 562134 562314 562341 623451 623415 623541 623514 623154 62314
5 624351 624315 624531 624513 624153 624135 625431 625413 625341 625314 625134 6
25143 621453 621435 621543 621534 621354 621345 632451 632415 632541 632514 6321
54 632145 634251 634215 634521 634512 634152 634125 635421 635412 635241 635214
635124 635142 631452 631425 631542 631524 631254 631245 643251 643215 643521 643
512 643152 643125 642351 642315 642531 642513 642153 642135 645231 645213 645321
645312 645132 645123 641253 641235 641523 641532 641352 641325 653421 653412 65
3241 653214 653124 653142 654321 654312 654231 654213 654123 654132 652431 65241
3 652341 652314 652134 652143 651423 651432 651243 651234 651324 651342 613452 6
13425 613542 613524 613254 613245 614352 614325 614532 614523 614253 614235 6154
32 615423 615342 615324 615234 615243 612453 612435 612543 612534 612354 612345
330 <<<就这个 System.currentTimeMillis()-t1
...
6 4 5 2 3 1
6 4 5 3 1 2
6 4 5 3 2 1
6 5 1 2 3 4
6 5 1 2 4 3
6 5 1 3 2 4
6 5 1 3 4 2
6 5 1 4 2 3
6 5 1 4 3 2
6 5 2 1 3 4
6 5 2 1 4 3
6 5 2 3 1 4
6 5 2 3 4 1
6 5 2 4 1 3
6 5 2 4 3 1
6 5 3 1 2 4
6 5 3 1 4 2
6 5 3 2 1 4
6 5 3 2 4 1
6 5 3 4 1 2
6 5 3 4 2 1
6 5 4 1 2 3
6 5 4 1 3 2
6 5 4 2 1 3
6 5 4 2 3 1
6 5 4 3 1 2
6 5 4 3 2 1
921 <<<这里
TotalCount is :720呵呵,大家互相学习嘛
但是CSDN里的高手一般都不肯出招,在CSDN里学不了什么东西
public class test{
String[] list;
StringBuffer sb;
test(String in){
int temp = Integer.parseInt(in);
list = new String[temp];
for(int i=0;i<temp;i++)
list[i] = String.valueOf(i+1);
printList(0,list);
}
String[] replaceStr(String[] s,int c1,int c2){
String temp = s[c1];
s[c1] = s[c2];
s[c2] = temp;
return s;
}
void printList(int start,String[] temparr){
if(start==list.length-1){
sb = new StringBuffer();
for(int i=0;i<temparr.length;i++)
sb.append(temparr[i]);
sb.append(" ");
System.out.print(sb);
}else{
for(int i=start;i<list.length;i++){
replaceStr(temparr,start,i);
printList(start+1,temparr);
replaceStr(temparr,i,start);
}
}
}
public static void main(String args[]){
long t1 = System.currentTimeMillis();
new test(args[0]);
System.out.println(System.currentTimeMillis()-t1);
}
}514236 514263 514623 514632 512436 512463 512346 512364 512634 512643 516423 516
432 516243 516234 516324 516342 563412 563421 563142 563124 563214 563241 564312
564321 564132 564123 564213 564231 561432 561423 561342 561324 561234 561243 56
2413 562431 562143 562134 562314 562341 623451 623415 623541 623514 623154 62314
5 624351 624315 624531 624513 624153 624135 625431 625413 625341 625314 625134 6
25143 621453 621435 621543 621534 621354 621345 632451 632415 632541 632514 6321
54 632145 634251 634215 634521 634512 634152 634125 635421 635412 635241 635214
635124 635142 631452 631425 631542 631524 631254 631245 643251 643215 643521 643
512 643152 643125 642351 642315 642531 642513 642153 642135 645231 645213 645321
645312 645132 645123 641253 641235 641523 641532 641352 641325 653421 653412 65
3241 653214 653124 653142 654321 654312 654231 654213 654123 654132 652431 65241
3 652341 652314 652134 652143 651423 651432 651243 651234 651324 651342 613452 6
13425 613542 613524 613254 613245 614352 614325 614532 614523 614253 614235 6154
32 615423 615342 615324 615234 615243 612453 612435 612543 612534 612354 612345
100 <<降到100了排除输出部分(不输出内容),仅从算法方面看,输入10时
原先使用容器的要7200毫秒左右
改用数组后,要4800毫秒左右
在优化空间复杂度之后,只用了550毫秒
package cxz.math;import java.util.ArrayList;public class Arrange {
private static ArrayList<Integer> v = new ArrayList<Integer>();
static int n = 5, m = 3; public static void main(String[] args) {
for (int i = 0; i < n; i++)
sign[i] = false;
f(n, m);
} private static boolean[] sign = new boolean[n];
static int count = 0;
static int num = 0; public static void f(int n, int m) {
if (count == m) {
show();
return;
}
for (int i = 0; i < n; i++) {
if (!sign[i]) {
v.add(i);
sign[i] = true;
count++;
f(n, m);
count--;
sign[i] = false;
v.remove(v.size() - 1);
}
}
} public static void show() {
System.out.print((num++) + ":");
for (int i = 0; i < v.size(); i++)
System.out.print(v.get(i) + " ");
System.out.println();
}
}
///////////
0:0 1 2
1:0 1 3
2:0 1 4
3:0 2 1
4:0 2 3
5:0 2 4
6:0 3 1
7:0 3 2
8:0 3 4
9:0 4 1
10:0 4 2
11:0 4 3
12:1 0 2
13:1 0 3
14:1 0 4
15:1 2 0
16:1 2 3
17:1 2 4
18:1 3 0
19:1 3 2
20:1 3 4
21:1 4 0
22:1 4 2
23:1 4 3
24:2 0 1
25:2 0 3
26:2 0 4
27:2 1 0
28:2 1 3
29:2 1 4
30:2 3 0
31:2 3 1
32:2 3 4
33:2 4 0
34:2 4 1
35:2 4 3
36:3 0 1
37:3 0 2
38:3 0 4
39:3 1 0
40:3 1 2
41:3 1 4
42:3 2 0
43:3 2 1
44:3 2 4
45:3 4 0
46:3 4 1
47:3 4 2
48:4 0 1
49:4 0 2
50:4 0 3
51:4 1 0
52:4 1 2
53:4 1 3
54:4 2 0
55:4 2 1
56:4 2 3
57:4 3 0
58:4 3 1
59:4 3 2
package cxz.math;public class Arrange {
static int n = 6, m = 6; public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < n; i++)
sign[i] = false;
f(n, m);
System.out.println("calculate take time:" + (System.currentTimeMillis() - start) + " ms");
System.out.println(buf.toString());
System.out.println("total take time:" + (System.currentTimeMillis() - start) + " ms");
} private static boolean[] sign = new boolean[n];
static int count = 0;
static int num = 0; public static void f(int n, int m) {
if (count == m) {
show();
return;
}
for (int i = 0; i < n; i++) {
if (!sign[i]) {
sign[i] = true;
count++;
f(n, m);
count--;
sign[i] = false;
}
}
} static StringBuffer buf = new StringBuffer(); public static void show() {
buf.append((num++)).append(':');
for (int i = 0; i < n; i++)
if (sign[i])
buf.append(i).append(' ');
buf.append('\n');
}
}
package cxz.math;public class Arrange {
static int n = 6, m = 6; public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < n; i++)
sign[i] = false;
for (int i = 0; i < m; i++)
vv[i] = -1;
f(n, m);
System.out.println("calculate take time:" + (System.currentTimeMillis() - start) + " ms");
System.out.println(buf.toString());
System.out.println("total take time:" + (System.currentTimeMillis() - start) + " ms");
} private static boolean[] sign = new boolean[n];
private static int[] vv = new int[m];
static int count = 0;
static int num = 0; public static void f(int n, int m) {
if (count == m) {
show();
return;
}
for (int i = 0; i < n; i++) {
if (!sign[i]) {
sign[i] = true;
int c = count;
vv[c] = i;
count++;
f(n, m);
count--;
sign[i] = false;
vv[c] = -1;
}
}
} static StringBuffer buf = new StringBuffer(); public static void show() {
buf.append(num++).append(':');
for (int i = 0; i < m; i++)
buf.append(vv[i]).append(' ');
buf.append('\n');
}
}
String[] list;
StringBuffer sb = new StringBuffer();
int len,start,x;
test(String in){
len = Integer.parseInt(in);
list = new String[len];
for(int i=0;i<len;i++)
list[i] = String.valueOf(i+1);
printList();
System.out.print(sb);
}
void replaceStr(int c1,int c2){
String temp = list[c1];
list[c1] = list[c2];
list[c2] = temp;
}
void printList(){
if(start==len-1){
if(x++>10000000){
System.out.print(sb);
sb = new StringBuffer();
}
for(int i=0;i<len;i++,x++)
sb.append(list[i]);
sb.append(" ");
}else{
for(int i=start;i<len;i++){
replaceStr(start++,i);
printList();
replaceStr(i,--start);
}
}
}
public static void main(String args[]){
long t1 = System.currentTimeMillis();
new test(args[0]);
System.out.println(System.currentTimeMillis()-t1);
}
}
private int n=0;
private void printSoredStr(String[] str,String s) {
if(str.length<1) {
n++;
System.out.println("第"+n+"种排列:"+s);
return;
}
for(int i=0; i<str.length; i++) {
String[] tem=new String[str.length-1];
int count=0;
for(int j=0; j<str.length; j++) {
if(j==i)
continue;
tem[count]=str[j];
count++;
}
this.printSoredStr(tem,s+"\t"+str[i]);
}
}
public void soreCharactors(String[] str) {
printSoredStr(str,"");
}
public static void main(String[] args) {
String[] str={"1","2","3","4"};
new SoreStr().soreCharactors(str);
}
}
试试这个,我以前写的~~
呵呵,花猫同学也用stringBuffer来做,这样一旦数字在10以上,就会出现内存耗尽了
------------------------
我用stringBuffer只是为了存储输出结果,如果不显示的话,可以去掉。或者一条条输出,不用stringBuffer。我的意见是数字在10以上,最好是把结果存到文件中去。
using namespace std;void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}//回溯法
//a[]是需要回溯的数组;
//目标是求C(n,m)
//curlen与startIndex是算法中需要的,初始都是0
void combi(int a[], int n, int m, int curlen, int startIndex)
{
if(curlen==m)
{
for(int i=0;i<m;i++)
cout<<a[i];
cout<<endl;
}else
{
for(int i=startIndex;i<n;i++)
{
swap(a[i],a[curlen]);
combi(a,n,m,curlen+1,i+1);
swap(a[i],a[curlen]);
}
}
}
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
//以下示例是求C(10,6)个所有组合
combi(a,10,6,0,0);
}程序输出:
012345
012346
012347
012348
012349
012356
012357
012358
012359
012367
012368
012369
012378
012379
012389
012456
012457
012458
012459
012467
012468
012469
012478
012479
012489
012567
012568
012569
012578
012579
012589
012678
012679
012689
012789
013456
013457
013458
013459
013467
013468
013469
013478
013479
013489
013567
013568
013569
013578
013579
013589
013678
013679
013689
013789
014567
014568
014569
014578
014579
014589
014678
014679
014689
014789
015678
015679
015689
015789
016789
023456
023457
023458
023459
023467
023468
023469
023478
023479
023489
023567
023568
023569
023578
023579
023589
023678
023679
023689
023789
024567
024568
024569
024578
024579
024589
024678
024679
024689
024789
025678
025679
025689
025789
026789
034567
034568
034569
034578
034579
034589
034678
034679
034689
034789
035678
035679
035689
035789
036789
045678
045679
045689
045789
046789
056789
123456
123457
123458
123459
123467
123468
123469
123478
123479
123489
123567
123568
123569
123578
123579
123589
123678
123679
123689
123789
124567
124568
124569
124578
124579
124589
124678
124679
124689
124789
125678
125679
125689
125789
126789
134567
134568
134569
134578
134579
134589
134678
134679
134689
134789
135678
135679
135689
135789
136789
145678
145679
145689
145789
146789
156789
234567
234568
234569
234578
234579
234589
234678
234679
234689
234789
235678
235679
235689
235789
236789
245678
245679
245689
245789
246789
256789
345678
345679
345689
345789
346789
356789
456789