生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯剪邮票问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。
(僅僅連接一個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。
請你計算,一共有多少種不同的剪取方法。
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
這里的圖片我就不上傳了,大家應該知道題目內容了。
java代碼如下
一開始容易想到的是從某個頂點dfs,走過的路徑就是一種可能解,但是dfs只能處理L形的減法,不能處理T形的減法。
因為是填空題,不考慮時間問題,我們用暴力法破解,在12個格子中選取5個格子然后判斷是否符合題目要求,若符合則ans++。
注意此處用到了無重復的全排列。
import java
.util
.*
;public class Main {static int ans
= 0;static int[][] g
= new int[3][4]; static int[] path
= new int[12]; static int[] arr
= { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static int[] vis
= new int[12]; public static void main(String
[] args
) {Scanner sc
= new Scanner(System
.in
);f(0);System
.out
.println(ans
);sc
.close();}private static void f(int k
) {if (k
== 12) {if (check()) {ans
++;}}for (int i
= 0; i
< arr
.length
; i
++) {if (i
> 0 && arr
[i
] == arr
[i
- 1] && vis
[i
- 1] == 0) {continue;}if(vis
[i
]==0) { vis
[i
] = 1;path
[k
] = arr
[i
];f(k
+ 1);vis
[i
] = 0;}}}private static boolean check() {for (int i
= 0; i
< g
.length
; i
++) {for (int j
= 0; j
< g
[i
].length
; j
++) {g
[i
][j
] = path
[i
* 4 + j
];}}int cnt
= 0; for (int i
= 0; i
< g
.length
; i
++) {for (int j
= 0; j
< g
[i
].length
; j
++) {if (g
[i
][j
] == 1) {dfs(i
, j
); cnt
++;}}}return cnt
== 1;}private static void dfs(int i
, int j
) {g
[i
][j
] = 0;if (i
>= 1) {if (g
[i
- 1][j
] == 1) {dfs(i
- 1, j
);}}if (i
<= 1) {if (g
[i
+ 1][j
] == 1) {dfs(i
+ 1, j
);}}if (j
>= 1) {if (g
[i
][j
- 1] == 1) {dfs(i
, j
- 1);}}if (j
<= 2) {if (g
[i
][j
+ 1] == 1) {dfs(i
, j
+ 1);}}}}
總結
以上是生活随笔為你收集整理的蓝桥杯剪邮票问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。