每日一題之 hiho232周 拆字遊戲

2021-09-02 22:00:06 字數 2975 閱讀 4863

給出乙個01矩陣,1佔據的部分即為需要拆的字,如果兩個1分享一條邊,那麼它們連通。連通具有傳遞性,即如果a、b連通,b、c連通,則a、c連通。

連通的一系列1被看做可以拆出的一塊,現在小kui需要輸出這些拆出的塊(用乙個01矩陣表示,並且要求矩陣的大小盡可能的小)。

為了確保輸出的順序盡可能的和書寫的順序一致,小kui從每個塊中選出最左上角的點(最左側的點中,最靠上的)作為代表點,然後按照代表點從左到右(若相同則按從上到下)的順序輸出所有拆出的塊。

輸入輸入的第一行為兩個正整數n、m,表示01矩陣的大小。

接下來n行,每行m個01字元,描述乙個需要拆的字。

對於40%的資料,滿足1<=n,m<=10。

對於100%的資料,滿足1<=n,m<=500。

輸出按照代表點從左到右(若相同則按從上到下)的順序輸出所有拆出的塊。

對於每個塊,先輸出其大小,然後用對應的01矩陣表示這個塊。

額外的樣例

樣例輸入

11 17

00000000000000000

00001111111100000

00000000000000000

00111111111111100

00000000100000000

00000010101110000

00000110100011000

00011100100001000

00000010100000000

00000001100000000

00000000000000000

樣例輸出

7 13

1111111111111

0000001000000

0000001000000

0000001000000

0000001000000

0000001000000

0000011000000

3 40001

0011

1110

1 811111111

1 11

3 41110

0011

0001

樣例輸入

14 22

0000000000001111111100

0000000000001101101100

0000110000001111111100

0000110000001101101100

0111111110001111111100

0110110110000000000000

0110110110000011000000

0111111110001111111000

0000110000000001100000

0000110110001111111100

0111111111000111111000

0000000010001101101100

0000000000000001100000

0000000000000011100000

樣例輸出

10 9

000110000

000110000

111111110

110110110

110110110

111111110

000110000

000110110

111111111

000000010

5 811111111

11011011

11111111

11011011

11111111

8 800110000

11111110

00011000

11111111

01111110

11011011

00011000

00111000

思路:簡單的bfs或者dfs求聯通塊,在dfs過程中要維護上下左右四個最值。然後記錄下每個聯通的1的座標,最後輸出的時候利用座標變換把原圖中的座標對映到要輸出的圖中。也就是要輸出的圖是以left 和 up 作為新矩陣中 0,0這個點的。記錄的每個聯通的座標要做 x - up, y - left 這樣的變換。把1填到要輸出的矩陣中行了。

#include

using

namespace std;

const

int maxn =

505;

int n, m;

string g[maxn]

;int vis[maxn]

[maxn]

;int up, down, left, right;

int dir[4]

[2]=

,,,}

;bool

judge

(int x,

int y)

return

false;}

void

dfs(

int x,

int y, vectorint,

int>>

& res)}}

void

print

(int x,

int y, vectorint,

int>>

&res)

cout << width <<

" "<< len << endl;

for(

int i =

0; i <

(int

)res.

size()

;++i)

for(

int i =

0; i < width;

++i)

}void

solve()

}}}int

main()

memset

(vis,0,

sizeof

(vis));

solve()

;return0;

}

每日一題之 hiho222周 Big Plus

描述 given an nxn 01 matrix,find the biggest plus consisting of 1s in the matrix.size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1 1 1 111...

每日一題之 hiho1744 hohahola

描述 有一種叫作hohahola的飲料,售價是x元一瓶。小hi非常喜歡這種飲料,但是他現在身無分文。不過小hi有n張優惠券,買hohahola時每瓶最多使用一張優惠券,可以使該瓶 減少y元。y x 同時優惠券可以 小hi每 一張優惠券可以獲得z元。請你幫小hi計算通過 若干優惠券,他最多可以買多少瓶...

每日一題之 hiho1304 24點

週末,小hi和小ho都在家待著。在收拾完房間時,小ho偶然發現了一副撲克,於是兩人考慮用這副撲克來打發時間。小ho 玩點什麼好呢?小hi 兩個人啊,不如來玩24點怎麼樣,不靠運氣就靠實力的遊戲。小ho 好啊,好啊。經過若干局遊戲之後 小ho 小hi,你說如果要寫個程式來玩24點會不會很複雜啊?小hi...