題目連結:

JAVA 程式碼

//作者:骷骷
//網誌:http://bekachu.pixnet.net/blog

public class Test{

	static int[][] t=new int[6][12];
	
	public static void main(String[] args) {
		
		//initial t[0].
		for(int i=0;i<12;i++){
			
			t[0][i]=11-i;
		}		
		
		next(0);		
	}
	
	static void next(int ti){
		
		//start next
		while(!check(ti)){
			
			if(isMax(ti)){
				
				if(ti==5){
					
					System.out.println("End.");
					return;
				}
				
				next(--ti);
				return;
			}

			add(ti);
		}
		
		ti++;
		//print answer.
		if(5<ti){
			
			print();
			
			add(5);
			next(5);
			return;
		}
		
		copyRow(ti);
		next(ti);				
	}
	
	static String iToS(int i){
		String s=null;
		
		switch (i) {
		case 0:
			s="A1";
			break;
		case 1:
			s="B1";
			break;
		case 2:
			s="C1";
			break;
		case 3:
			s="D1";
			break;
		case 4:
			s="A2";
			break;
		case 5:
			s="B2";
			break;
		case 6:
			s="C2";
			break;
		case 7:
			s="D2";
			break;
		case 8:
			s="A3";
			break;
		case 9:
			s="B3";
			break;
		case 10:
			s="C3";
			break;
		case 11:
			s="D3";
			break;
		default:
			break;
		}		
		
		return s;
	}
	
	static void print(){
		
		System.out.println("\t第一關"+"\t第二關"+"\t第三關"+"\t第四關"+"\t第五關"+"\t第六關");
		for(int i=0;i<6;i++){
			
			System.out.print("時段"+(i+1)+"\t");
			for(int j=0;j<6;j++){
				
				System.out.print(iToS(t[i][2*j])+iToS(t[i][2*j+1])+"\t");
				//System.out.print(t[i][2*j]+"-"+t[i][2*j+1]+"\t");
			}
			System.out.println();
		}
		System.out.println("==========");
	}
	
	//t[ti] next permutation.
	static void add(int ti){
		
		int i=-1;
		int j=1;
		
		while(t[ti][j-1]<t[ti][j]){
			
			j++;
		}
		
		for(int k=0;k<j;k++){
			
			if(t[ti][k]>t[ti][j]){
				
				if(i==-1){
					
					i=k;
				}else if(t[ti][k]<t[ti][i]){
						
					i=k;
				}
			}
		}
		
		change(ti,i,j);
		maxToMin(ti, 0, j-1);
	}
	
	static void maxToMin(int ti, int i, int j){
		
		for(int k=i;k<j;k++){
			
			for(int z=k+1;z<=j;z++){
				
				if(t[ti][k]<t[ti][z]){
					
					change(ti,k,z);
				}
			}
		}
	}
	
	static void change(int ti, int i, int j){
		
		int k=t[ti][i];
		t[ti][i]=t[ti][j];
		t[ti][j]=k;
	}
	
	static void copyRow(int ti){
		
		//copy t[ti-1] to t[ti].
		for(int i=0;i<12;i++){
			
			t[ti][i]=t[ti-1][i];
		}
	}
	
	static boolean isMax(int ti){
		
		//check is it max
		boolean b=true;
		for(int i=0;i<12;i++){
			
			if(t[ti][i]!=i){
				
				b=false;
				break;
			}
		}
		
		return b;
	}
	
	static boolean check(int ti){
		
		boolean b=true;
		for(int i=0;i<6;i++){
			
			//check row condition.
			if(t[ti][2*i]<t[ti][2*i+1] || (t[ti][2*i+1]-t[ti][2*i])%4==0){
			//if((t[ti][2*i+1]-t[ti][2*i])%4==0){
				
				b=false;
				return b;
			}
			
			//check column is only one.
			for(int j=ti-1;j>=0;j--){
				
				if(t[ti][2*i]==t[j][2*i] || t[ti][2*i]==t[j][2*i+1] || t[ti][2*i+1]==t[j][2*i] || t[ti][2*i+1]==t[j][2*i+1]){
					
					b=false;
					return b;
				}
			}
		}
		
		//check row is only one.
		for(int i=0;i<10;i++){
			
			for(int j=i+1;j<12;j++){
				
				if(t[ti][i]==t[ti][j]){
					
					b=false;
					return b;
				}
			}
		}
		
		return b;
	}
}
/*輸出結果:
		第一關	第二關	第三關	第四關	第五關	第六關
時段1		D3C3	B3A3	D2C2	B2A2	D1C1	B1A1	
時段2		B3A3	D3C3	B2A2	D2C2	B1A1	D1C1	
時段3		D1C1	B1A1	D3C3	B3A3	D2C2	B2A2	
時段4		B1A1	D1C1	B3A3	D3C3	B2A2	D2C2	
時段5		D2C2	B2A2	D1C1	B1A1	D3C3	B3A3	
時段6		B2A2	D2C2	B1A1	D1C1	B3A3	D3C3	
==========
End.
*/

==========

排列可以直接寫,組合的部份骷骷是用條件刪除法,

P幣沒賺到,因為骷骷寫完再debug檢查完全無誤之後,

已經有人解完,P幣被賺走了……

今天骷骷要換寫別的程式碼,

不想另外再開一個專案,

專案開越多電腦跑越慢……,

所以將此程式碼PO上來備份一下。

arrow
arrow
    文章標籤
    JAVA 大地遊戲 排列組合
    全站熱搜

    骷骷 發表在 痞客邦 留言(0) 人氣()