二進位制迷宮 貪心 BFS

2021-08-10 07:51:23 字數 1452 閱讀 8774

題目大意

給出乙個n*m的圖,數字要麼是0要麼是1。從左上角座標為(1,1)的格仔出發,走到右下角的座標為(n,m)的格仔,可以沿上下左右四個方向行走。每到乙個格仔,就記錄下裡面的數字。到達終點的時候,將得到乙個由0和1構成的序列,把這個序列看做乙個二進位制數(可以含前導零)。要求這個二進位制數盡可能小,計算並輸出這個二進位制數。

資料範圍

對於30%的資料:1≤n,m≤100

對於100%的資料:1≤n,m≤1000

考試的時候並沒有說是搜尋專項訓練賽,所以一開始想到dp是很正常的,竟然有同學使用了string型別的dp陣列,真是開了眼界(然而這樣ac不了)。

首先容易想到,去掉前導零後,這個二進位制數的位數要盡量少,在保證位數最少的情況下,盡量讓高位選0。這個貪心是顯然正確的,但是怎樣知道位數最小值是多少?從**開始貪心?

題目中上下左右都可以行走,如果是dp的話狀態不是很好轉移。如果說只能向下或向右走容易讓我們想到dp,那麼多個方向都能行走容易讓我們想到bfs

其實,「只能向下或向右走」也能指向正解。如果當前已經有1出現了,那麼就只能向下或向右走了,因為不這樣做會使位數增多。注意到在只能向下或向右走的前提下,走到終點的步數是一定的,是能夠算出來的。保證位數最少,可以通過bfs找到離終點「最近」的乙個或者多個0。

接下來就要從這些0出發找到最優解。只能向下或向右走,此時當然可以用dp了,但是用string型別的dp陣列?其實還是bfs就可以了。開乙個答案陣列,記錄答案的每一位上填0還是填1,這樣就可以剪掉上一步不可能達到最優解的情況,具體實現見**。

時間複雜度o(

mn)

**:

#include

#include

#include

#define maxn 1005

using

namespace

std;

int n,m,id[maxn][maxn];

char map[maxn][maxn];

int ans[maxn*2];

bool vis[maxn][maxn];

struct node;

//x,y表示位置,step記錄從符合要求的0開始已經走了多少步,v記錄上一步的權值

queue

q;int max=1;

int dx[4]=,dy[4]=;

void bfs()}}

}bool mark[maxn][maxn];

void getans()

}//多個滿足條件的0,全部入隊

while(q.size())}}

}}int main()

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...

mysql二進位制 MySql二進位制連線方式詳解

使用mysql二進位制方式連線 您可以使用mysql二進位制方式進入到mysql命令提示符下來連線mysql資料庫。例項以下是從命令列中連線mysql伺服器的簡單例項 root host mysql u root p enter password 在登入成功後會出現 mysql 命令提示視窗,你可以...