天天看點

JAVA藍橋杯剪郵票,第七屆藍橋杯JavaB組——第7題剪郵票

題目:

剪郵票

如【圖1.jpg】, 有12張連在一起的12生肖的郵票。

現在你要從中剪下5張來,要求必須是連着的。

(僅僅連接配接一個角不算相連)

比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。

請你計算,一共有多少種不同的剪取方法。

請填寫表示方案數目的整數。

注意:你送出的應該是一個整數,不要填寫任何多餘的内容或說明性文字。

JAVA藍橋杯剪郵票,第七屆藍橋杯JavaB組——第7題剪郵票
JAVA藍橋杯剪郵票,第七屆藍橋杯JavaB組——第7題剪郵票
JAVA藍橋杯剪郵票,第七屆藍橋杯JavaB組——第7題剪郵票

解題思路:

//首先從12數中選出5個數 用深搜(保證五個數是遞增的,避免重複) 将五個數轉化為坐标形式

// 再判斷這5個數是否相連,用廣搜

public class Main {

private static int count;

private static int[] dp = new int[12];

private static int[] arr = new int[5];

public static void main(String[] args) {

division(1, 0);

System.out.println(count);

}

public static void division(int pos, int curIndex) {

if (pos > 5) {

// 此時已經剪好了5個生肖(即5個數),可以開始判斷這5個生肖剪下來是否是連續的

// 這裡定義一個boolean數組,如果5個值都是true,那麼則表示這5個生肖剪下來是連續的

boolean[] visits = new boolean[5];

isContinue(visits, 0);

if (visits[0] && visits[1] && visits[2] && visits[3] && visits[4]) {

count++;

}

return;

}

for (int i = curIndex; i < dp.length; i++) {

arr[pos - 1] = i;

division(pos + 1, i + 1);

}

}

public static void isContinue(boolean[] visits, int index) {

// 此時通路了下标為index的數

visits[index] = true;

// 依次周遊visits數組,如果發現對應下标的值是false,那麼表示該數還沒有被通路

for (int i = 0; i < visits.length; i++) {

// 先判斷此時下标i這個數是否已經被通路,若已被通路,則不做任何事情,反之則繼續進行後續判斷

// 判斷是否在同一行其相鄰

if (!visits[i] && (arr[i] / 4 == arr[index] / 4) && (arr[i] + 1 == arr[index] || arr[i] - 1 == arr[index])) {

// 遞歸

// 把下标為i的這個數作為開始,讓它再去依次周遊visits數組,看有沒有和它相鄰的,如果有,就繼續重複這個步驟下去

isContinue(visits, i);

}

// 判斷是否在同一列且在鄰行

if (!visits[i] && (arr[i] - 4 == arr[index] || arr[i] + 4 == arr[index])) {

// 遞歸

// 把下标為i的這個數作為開始,讓它再去依次周遊visits數組,看有沒有和它相鄰的,如果有,就繼續重複這個步驟下去

isContinue(visits, i);

}

}

}

}

答案:

116