
題目連結:
[其他] 大地遊戲(排列組合) 急.1000P徵
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.
*/