1. ใช้วิธีสถานะไบนารี่เพื่อค้นหาการเรียงสับเปลี่ยนและการรวมกัน วิธีการนี้ค่อนข้างเข้าใจง่าย แต่ประสิทธิภาพการดำเนินการไม่สูงนัก
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.util.Arrays;
//ใช้อัลกอริธึมไบนารีเพื่อดำเนินการจัดเรียงแบบเต็ม
//นับ1:170187
//count2:291656
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
เริ่มต้นนาน=System.currentTimeMillis();
นับ2();
ปลายยาว=System.currentTimeMillis();
System.out.println (สิ้นสุดการเริ่มต้น);
-
โมฆะคงที่ส่วนตัว count2(){
int[] num=ใหม่ int []{1,2,3,4,5,6,7,8,9};
สำหรับ(int i=1;i<Math.pow(9, 9);i++){
สตริง str=Integer.toString(i,9);
int sz=str.ความยาว();
สำหรับ(int j=0;j<9-sz;j++){
str="0"+str;
-
ถ่าน [] temp=str.toCharArray();
Arrays.sort(อุณหภูมิ);
สตริง gl=สตริงใหม่ (ชั่วคราว);
ถ้า(!gl.เท่ากับ("012345678")){
ดำเนินการต่อ;
-
ผลสตริง = "";
สำหรับ(int m=0;m<str.length();m++){
ผลลัพธ์+=num[Integer.parseInt(str.charAt(m)+"")];
-
System.out.println (ผลลัพธ์);
-
-
โมฆะคงที่สาธารณะ count1(){
int[] num=ใหม่ int []{1,2,3,4,5,6,7,8,9};
int[] ss=ใหม่ int []{0,1,2,3,4,5,6,7,8};
int[] temp=ใหม่ int[9];
ในขณะที่(อุณหภูมิ[0]<9){
อุณหภูมิ[temp.length-1]++;
สำหรับ(int i=temp.length-1;i>0;i--){
ถ้า(อุณหภูมิ[i]==9){
อุณหภูมิ[i]=0;
อุณหภูมิ[i-1]++;
-
-
int []tt=temp.clone();
อาร์เรย์.sort(tt);
ถ้า(!Arrays.equals(tt,ss)){
ดำเนินการต่อ;
-
ผลสตริง = "";
สำหรับ(int i=0;i<num.length;i++){
ผลลัพธ์+=num[อุณหภูมิ[i]];
-
System.out.println (ผลลัพธ์);
-
-
-
2. ใช้การคิดแบบเรียกซ้ำเพื่อค้นหาการเรียงสับเปลี่ยนและการรวมกันซึ่งต้องใช้โค้ดจำนวนมาก
คัดลอกรหัสรหัส ดังต่อไปนี้:
การปฏิบัติด้านบรรจุภัณฑ์
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
การทดสอบชั้นเรียนสาธารณะ1 {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
วัตถุ[] tmp={1,2,3,4,5,6};
// ArrayList<Object[]> rs=RandomC(tmp);
ArrayList<วัตถุ[]> rs=cmn(tmp,3);
สำหรับ(int i=0;i<rs.size();i++)
-
// System.out.print(i+"=");
สำหรับ(int j=0;j<rs.get(i).length;j++)
-
System.out.print(rs.get(i)[เจ]+",");
-
System.out.println();
-
-
// ค้นหาการรวมกันของอาร์เรย์
ArrayList แบบคงที่ <Object[]> RandomC (แหล่งที่มาของ Object [])
-
ArrayList<Object[]> result=new ArrayList<Object[]>();
ถ้า(source.length==1)
-
result.add(ที่มา);
-
อื่น
-
วัตถุ [] psource = วัตถุใหม่ [source.length-1];
สำหรับ(int i=0;i<psource.length;i++)
-
psource[i]=แหล่งที่มา[i];
-
ผลลัพธ์ = RandomC (psource);
int len=result.size();//ความยาวของชุด fn
result.add((วัตถุใหม่[]{แหล่งที่มา[source.length-1]}));
สำหรับ(int i=0;i<len;i++)
-
วัตถุ[] tmp=วัตถุใหม่[result.get(i).ความยาว+1];
สำหรับ(int j=0;j<tmp.length-1;j++)
-
tmp[เจ]=result.get(i)[เจ];
-
tmp[tmp.length-1]=แหล่งที่มา[source.length-1];
result.add(tmp);
-
-
ส่งคืนผลลัพธ์;
-
ArrayList แบบคงที่ <Object[]> cmn (แหล่งที่มาของ Object [], int n)
-
ArrayList<Object[]> result=new ArrayList<Object[]>();
ถ้า(n==1)
-
สำหรับ(int i=0;i<source.length;i++)
-
result.add(วัตถุใหม่[]{แหล่งที่มา[i]});
-
-
อื่นถ้า (source.length==n)
-
result.add(ที่มา);
-
อื่น
-
วัตถุ [] psource = วัตถุใหม่ [source.length-1];
สำหรับ(int i=0;i<psource.length;i++)
-
psource[i]=แหล่งที่มา[i];
-
ผลลัพธ์ = cmn (psource, n);
ArrayList<วัตถุ[]> tmp=cmn(psource,n-1);
สำหรับ(int i=0;i<tmp.size();i++)
-
วัตถุ [] rs = วัตถุใหม่ [n];
สำหรับ(int j=0;j<n-1;j++)
-
อาร์เอส[เจ]=tmp.get(i)[เจ];
-
฿[n-1]=แหล่งที่มา[source.length-1];
result.add(อาร์เอส);
-
-
ส่งคืนผลลัพธ์;
-
-
3. ใช้แนวคิดของการเขียนโปรแกรมแบบไดนามิกเพื่อค้นหาการเรียงสับเปลี่ยนและการรวมกัน
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ ACM;
// การค้นหาที่มีประสิทธิภาพสำหรับหมายเลขชุดค่าผสม
MainApp ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
int[] num=ใหม่ int[]{1,2,3,4,5};
สตริง str="";
//หาจำนวนผลรวมของตัวเลข 3 ตัว
// นับ(0,str,num,3);
// ค้นหาจำนวนชุดค่าผสมของตัวเลข 1-n
count1(0,str,หมายเลข);
-
โมฆะคงที่ส่วนตัว count1 (int i, String str, int [] num) {
ถ้า(i==num.length){
System.out.println(str);
กลับ;
-
count1(i+1,str,num);
count1(i+1,str+num[i]+",",num);
-
จำนวนโมฆะคงที่ส่วนตัว (int i, String str, int [] num, int n) {
ถ้า(n==0){
System.out.println(str);
กลับ;
-
ถ้า(i==num.length){
กลับ;
-
นับ(i+1,str+num[i]+",",num,n-1);
นับ(i+1,str,num,n);
-
-
ต่อไปนี้เป็นการจัด
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ Acm;
//ค้นหาการจัดเรียง ค้นหาการจัดเรียงหลังจากการเรียงสับเปลี่ยนหรือการรวมกันต่างๆ
นำเข้า java.util.Arrays;
นำเข้า java.util.Scanner;
การสาธิตคลาสสาธารณะ19 {
บูลีนคงที่ส่วนตัว f[];
โมฆะคงที่สาธารณะ main (String [] args) {
สแกนเนอร์ sc=สแกนเนอร์ใหม่ (System.in);
int sz=sc.nextInt();
สำหรับ(int i=0;i<sz;i++){
int sum=sc.nextInt();
f=บูลีนใหม่[ผลรวม];
Arrays.fill(f, จริง);
int[] num=ใหม่ int[ผลรวม];
สำหรับ(int j=0;j<sum;j++){
หมายเลข[เจ]=เจ+1;
-
int nn=sc.nextInt();
สตริง str="";
นับ(หมายเลข,str,nn);
-
-
-
-
* @param num หมายถึงอาร์เรย์ที่จะจัดเรียง
* @param str จัดเรียงสตริง
* @param nn คือจำนวนรายการที่เหลือที่ต้องจัดเรียง หากต้องการจัดเรียงแบบเต็ม nn คือความยาวของอาร์เรย์
-
จำนวนโมฆะคงที่ส่วนตัว (int [] num, String str, int nn) {
ถ้า(nn==0){
System.out.println(str);
กลับ;
-
สำหรับ(int i=0;i<num.length;i++){
ถ้า(!f[i]){
ดำเนินการต่อ;
-
ฉ[i]=เท็จ;
นับ(หมายเลข,str+num[i],nn-1);
ฉ[i]=จริง;
-
-
-