第七屆省賽 題7 剪郵票

2021-08-17 03:34:23 字數 1541 閱讀 5593

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

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

(僅僅連線乙個角不算相連)

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

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

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

注意:你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。

( 這兩位的解法都很好,但是核心演算法很相似,分辨不出誰是原作者,所以都貼上)

分析:下面切入正題。根據題目可以知道,4號5號位置以及8號9號位置是無法連通的。於是可以把

郵票初始化如下圖:

接下來分兩步完成題目要求:第一步是組合(從12張中選5張),第二部是判斷連通性。

組合比較好寫,此處不贅述。主要解釋一下如何判斷連通性(深度優先搜尋)。

根據上方我們對郵票的初始化,選擇的方向可以一致化為上下左右,上為-5,下為+5,左為-1,右為+1,這也是我覺得巧妙的地方。這樣就可以對選擇的郵票逐一去計算它分別向上下左右四個方向移動後的位置,這些得到的位置必須仍然是在1到14個位置中的乙個,並且,不能為5和10。

然後我們用深度優先搜尋的方法,先標記選擇的5張郵票都為未訪問的狀態,從第一張開始進行搜尋,如果它是未訪問的並且與上面我們算出的可以移動的位置是一致的,那麼就是滿足題意的取法。接下來不斷去搜尋就可以了。

最後對所有的取法計數求和,得出結果。

public class main ; //郵票初始化

private static int choose = new int[5]; //選擇的5張

private static boolean vis = new boolean[5]; //標記訪問狀態

private static int sum = 0; //計數

private static int move = ; //記錄移動方式

public static void main(string args)

vis[0] = true;

dfs(0);

//計數

boolean flag = true;

for (int i = 0; i < 5; i++)

}if (flag)

}system.out.println(sum);

} public static void dfs(int n)

}} }

}

答案:11

第七屆藍橋杯省賽7 剪郵票

如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內...

第七屆藍橋杯省賽剪郵票

如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內...

第七屆藍橋杯省賽A7 剪郵票

題目描述 如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任...