涼了,so sad.
十月份一直在整**的事兒,工作方面的東西沒看,題也沒做,結果就是碰到手撕**就掛qaq
也許碰到以前做過的型別題思路會好點,但是這個題也沒做過,就硬想,結果只想出了漏洞百出的思路。
題目如下:
問題描述:
給定乙個m*n的矩陣,裡面有數字1,0。 + 然後給定乙個座標:
(x, y)。
請寫乙個程式計算與座標x, y值相同,且連通的數字個數。
「連通」 定義為:左右或者上下數值一樣則認為這兩個塊是連通的,連通具有傳遞性。
輸入:matrix, x, y
輸出:n
舉例:輸入:
matrix =[[
1,0,
1,0]
[1,0
,0,0
][1,
1,0,
1][0
,1,0
,1][
1,1,
0,0]
}
我當時想到的思路就是去判斷目標點(x,y)周圍的十字方向的四個點是否連通,如果連通則繼續遞迴判斷。
當時手撕沒撕出來(寫的什麼稀爛**),就直接給面試官講了思路,面試官聽完回了一句,有個條件你沒提到。
然後我當時就懵了,沒想到自己已經那麼菜了。
以下內容和**主要參考這篇部落格。
這樣的無向圖遍歷問題主要採用bfs廣度優先搜尋實現。主要思路為:
實際**實現採用佇列居多,leetcode上有很多這樣的題目。**框架是:
vector<
int> tmp;
//結果
vector<
int> mask // 用於不再訪問之前訪問過的元素
queue<
int> q;
//用於儲存當前的連通域
q.push(.
..);
//將第乙個合適的解壓入
while
(! q.
empty()
)if( mask[ i+1]
==false
)//保證訪問的元素之前沒有訪問過,如果合適,就加入到佇列中
q.push(.
..)}
根據題目要求重新寫了**。
完整**為:
#include
#include
#include
#include
using
namespace std;
// 判斷該點是否已被遍歷過或是座標越界
bool
check
(vectorint>>
& matrix, vectorbool
>>
& mask,
int x,
int y,
int value)
// 如果該點未越界且未被遍歷過,則統計加1,將其加入佇列繼續檢索
void
add(vectorint>>
& matrix, vectorbool
>>
& mask, queueint,
int>>
& q,
int x,
int y,
int value,
int& result));
mask[x]
[y]=
true;}
}int
main()
,,,,
};vectorbool
>>
mask
(matrix.
size()
, vector<
bool
>
(matrix[0]
.size()
,false))
; queue int,
int>> q;
int result =1;
int x =2;
int y =2;
int value = matrix[x]
[y];
cout << value << endl;
pair<
int,
int> temp;
mask[x]
[y]=
true
; q.
push
(pair<
int,
int>);
while
(!q.
empty()
) cout << result << endl;
return0;
}
求矩陣連通域的個數
實際上是個寶石迷陣消除遊戲的簡化版,把不同顏色的寶石看成不同值的數字,然後連通超過三個的可以消除。這裡沒有加入消除後降落的機制,一定程度上簡化了問題的複雜度。那種需要每次消除後都從頭遍歷 using namespace std template t val t matrix,int w,int h,...
求連通域面積matlab
matlab有自帶函式bwreopen 求連通域,並移除小面積連通域,返回乙個mask模板不同連通域用不同的label標誌,背景用0標誌。function mask bwareopenlz lig,minarea untitled3 此處顯示有關此函式的摘要 此處顯示詳細說明 row size li...
求最大子矩陣的大小
給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...