考試題目講解 第3題 最少連通代價

2021-09-30 13:52:09 字數 2713 閱讀 1680

description

在乙個 n 行 m 列的字元網格上,恰好有 2 個彼此分開的連通塊。每個連通塊的乙個格點與它的上、下、左、右的格仔連通。如下圖所示:

現在要把這 2 個連通塊連通,求最少需要把幾個』.』轉變成』x』。上圖的例子中, 最少只需要把 3 個』.』轉變成』x』。下圖用』*』表示轉化為』x』的格點。

第 1 行:2 個整數 n 和 m(1<=n,m<=50)

接下來 n 行,每行 m 個字元,』x』表示屬於某個連通塊的格點,』.』表示不屬於某個連通塊的格點

output

第 1 行:1 個整數,表示最少需要把幾個』.』轉變成』x』

sample input

6 16

................

..***x....***...

...***x....xx...

.***x......***..

........***xx...

.........***....

sample output

3
題目解析這道題是一道搜尋題,或者說是一道「半搜尋題」。作者的做法和其他同學的做法有些出入,先講其他同學的做法吧。

還是看看作者的做法吧。作者之所以說「有很大出入」是因為我的**除了輸入,與其他同學的幾乎完全不一樣。首先作者也需要處理2個連通塊,但是,作者選擇用2個深度優先搜尋分別找到連通塊1和連通塊2所包含的點的座標。當然這需要儲存,作者用了vector動態陣列vectorvec[2],vec[0]表示第乙個連通塊,vec[1]表示第二個連通塊),它的基本型別是結構體da,da的兩個成員變數x,y是座標

找到所有的塊過後,我們可以用2重for迴圈找到連通塊1和連通塊2中的塊所有的搭配,並用ans儲存它們之間距離的最小值。這裡並不需要用廣度優先搜尋找到最短距離,而是用了乙個求曼哈頓距離的公式。即(i,j)到(m,n)的曼哈頓距離=|i-m|+|j-n|。c++裡絕對值的函式是fabs(建議不要用abs),在cmath庫里。但是這個公式求的是兩個點的曼哈頓距離,不會出現重疊面積的情況,而現在是兩個塊——在運用時會重疊一塊面積,於是要將所得結果減1

啊哈?你們覺得哪種方法簡單呢?

題外話

這次考試我們和高中的新生一起考,十分的興奮。說考遞迴和二分查詢,作者抓緊複習了一中午的二分查詢,結果沒有一道題考這個知識點。不過也好,作者沒有發揮失常,3道題全部ac,終於體驗了一把ak的爽。不久就是noi大賽了,有沒有一些同學和我一樣,也在期待11月呢?

程式樣例

真的不會超時嗎?同學們的做法——深度優先搜尋+廣度優先搜尋

#include

#include

#include

using

namespace

std;

int n,m,pre[1000000],a[1000000],b[1000000],minn,ans=1e10;

int x[4]=,y[4]=;

char

map[100][100];

bool mark[100][100];

bool check(int s,int t)

void fun(int d)

void bfs(int r,int c)}}

}}void dfs(int r,int c)

}void f()

}int main()

作者覺得還是自己的好點。深度優先搜尋+曼哈頓距離

/*lucky_glass*/

#include

#include

#include

#include

using

namespace

std;

struct da d;

vector

vec[2];

char

map[55][55];

int f[4][2]=,,,},r,c,s;

void flag(int x,int y)

}int main()

int la=vec[0].size(),lb=vec[1].size(),ans=1e8;

for(int i=0;ifor(int j=0;jint(fabs(vec[0][i].x-vec[1][j].x)+fabs(vec[0][i].y-vec[1][j].y)-1));

printf("%d\n",ans);

return

0;}

c 考試題目

一 專案提問 題 1 實現根號,要求最終與目標值的精度不大於0.0001 2 原題,求集合的子集c 的虛函式?innodb引擎的索引結構?為什麼是b 樹?三條查詢語句是否命中聯合索引?同步非同步阻塞非阻塞?為什麼是三次握手 四次揮手?timewait的意義?二 專案提問tcp ip5層協議 列舉協議...

Python考試題目記錄

考試時沒能完全寫出來,題目記不太清了,記錄一下,不知道答案對不對。僅做參考,不保證 的正確性!給出乙個列表l,找出支配元組 支配元組 列表l中有兩個元組t1,t2,if t1 0 t2 0 and t1 1 t2 1 and 至少有乙個元素,小於對應位置的元素 t1支配t2,要找t1 分析 1 先排...

2020 09 03 04 考試題目題解

題目傳送門 給出乙個圖,保證每個點有且僅有乙個出邊,對於每個點把它走 k 步這條路徑上的所有的點答案加 1 問最後每個點的答案。n le 5 times 10 5 考試的時候 sb 了,沒想出來怎麼做。首先你可以發現這其實是個基環樹森林,對於不在環上的點,它答案其實就是子樹內深度與它相差不超過 k ...