日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯剪邮票问题

發布時間:2024/3/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯剪邮票问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

如【圖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]; // g的一維數組形式static int[] arr = { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; // 從arr中選擇數放到path中構成剪紙的路徑static int[] vis = new int[12]; // 標記arr中已經被選取的數public static void main(String[] args) {Scanner sc = new Scanner(System.in);f(0);System.out.println(ans);sc.close();}/*** 全排列來得到一種填上五個格子的情況,然后再用dfs檢查這五個填上的的格子是否連通,若連通則ans++* * @param k* 當前在處理的數組*/private static void f(int k) {// 遞歸出口if (k == 12) {if (check()) {ans++;}}// 用抓取法與vis實現沒有重復的全排列// 選取arr[i]放入path[k]for (int i = 0; i < arr.length; i++) {// 如果arr[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;}}}/*** 更新g數組,調用dfs來判斷格子是或否連通* * @return*/private static boolean check() {// 將一維數組path轉變為二維數組gfor (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; // g中連通塊的數目// g上有5個格子被標記為1,現在用dfs做連通性檢查,有cnt個連通塊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); // 消除與g相連的所有連通塊cnt++;}}}return cnt == 1;}/*** 消除以g[i][j]為起點的連通塊,即將該連通塊置0* * @param i* @param j*/private static void dfs(int i, int j) {// 將當前點置0g[i][j] = 0;// 若該點四周有非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);}}}}

總結

以上是生活随笔為你收集整理的蓝桥杯剪邮票问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。