蓝桥杯.剪邮票(DFS)
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯.剪邮票(DFS)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Question:
Result:? 116
Solve:
這個(gè)題意還是比較好懂的,就是12個(gè)數(shù)里找出5個(gè)數(shù),然后看這5個(gè)數(shù)在方格中的位置是否相連,
代碼也是這個(gè)思路,但確實(shí)不太好寫,我換了好幾種方案,最后寫成了類似DFS里又套一個(gè)DFS的代碼。
首先通過深搜去搞出12選5的全部組合,然后通過再一個(gè)DFS去判斷選出的5個(gè)數(shù)在方格中是不是連通塊
我寫的判斷連通塊的方法是一個(gè)最暴力的方法,模擬出方格,然后從選出的第一個(gè)數(shù)(同時(shí)計(jì)數(shù)為1)開始,判斷其四周有沒有選出的數(shù),如果有,計(jì)數(shù)加一,并去dfs那個(gè)數(shù),在不斷搜索的過程中如果計(jì)數(shù)到了5,就說明5個(gè)數(shù)是連在一起的,結(jié)果數(shù)加一。
上代碼吧,注釋寫的也比較多。
Code:
#include <bits/stdc++.h> using namespace std;int cnt, res = 0; //res記錄結(jié)果 bool vis[4][5]; //標(biāo)記選出的5個(gè)數(shù)的坐標(biāo) bool vis2[4][5]; //標(biāo)記5個(gè)坐標(biāo)在dfs過程中是否經(jīng)過 int dir[4][2] = {1,0,-1,0,0,1,0,-1}; //四個(gè)方向 //判斷是不是連通塊 void dfs(int x, int y) {//是連通塊,結(jié)果加一 if(cnt == 5) res++;for(int i = 0; i < 4; i++){int dx = x + dir[i][0];int dy = y + dir[i][1];//邊界檢測,是否已經(jīng)走過檢測 if(vis2[dx][dy] || dx < 1 || dy < 1 || dx > 3 || dy > 4) continue;//是否為選中數(shù)判斷 if(!vis[dx][dy]) continue;cnt++; vis2[dx][dy] = true;dfs(dx,dy);} }//12選5的全排列 void que(int deep, int num) {if(deep > 5){cnt = 1;memset(vis2,false,sizeof(vis2));//找出第一個(gè)選出的數(shù)字進(jìn)入連通塊判斷 for(int i = 1; i <= 3; i++){for(int j = 1; j <= 4; j++){if(vis[i][j]){vis2[i][j] = true;dfs(i,j);//判斷結(jié)束后直接返回 return;}}}}//進(jìn)行全排列,并且將選出的數(shù)以坐標(biāo)的形式標(biāo)記下來 for(int i = num+1; i <= 12; i++){if(i%4==0){vis[i/4][4] = true;que(deep+1,i);vis[i/4][4] = false;}else{vis[i/4+1][i%4] = true;que(deep+1,i);vis[i/4+1][i%4] = false;}} }int main(void) {memset(vis,false,sizeof(vis));que(1,0);cout <<res;return 0; }最后附上藍(lán)橋杯匯總鏈接:藍(lán)橋杯C/C++A組省賽歷年真題題解?
聲明:圖片均來源于藍(lán)橋杯官網(wǎng),以個(gè)人刷題整理為目的,如若侵權(quán),請聯(lián)系刪除~
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯.剪邮票(DFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCIE一年后的心语
- 下一篇: 纯CSS实现三角形图标