
題目解析: 總共有n個房間,只有第0號房間沒鎖。每個房間裡會有一些其他房間的鑰匙,目標是判斷能不能成功打開並進入所有的房間
解題思路: 先設一個集合v記錄去過的房間,和一個佇列v1裝拿到鑰匙準備去開的房間。一開始先把0號房間塞進佇列,然後丟進迴圈開始跑。每次從佇列拿出一個房間,去過了就跳過,沒去過就加進集合,並把裡面的鑰匙全塞進佇列。最後檢查集合裡去過的房間數有沒有等於總房間數
class Solution {
public:
bool canVisitAllRooms(vector>& rooms) {
set v;
queue v1;
v1.push(0);
while (!v1.empty()) {
int n = v1.front();
v1.pop();
if (v.count(n)) continue;
v.insert(n);
for (int i = 0; i < rooms[n].size(); i++) {
v1.push(rooms[n][i]);
}
}
return v.size() == rooms.size();
}
};

題目解析: 給一個矩陣代表多個城市有沒有互相連接,如果有直接或間接相連的城市就會被當成同一個省份,找出總共有幾個省份
解題思路: 先設一個集合v記錄找過的城市,一個佇列v1找相連城市,和變數ans記錄省份數。接著丟進外層迴圈把每個城市看一遍,如果沒去過代表是新省份,把ans加1,並塞進佇列開始找關聯。內層迴圈會把有相連的城市全抓出來塞進佇列,一路把同省份的城市都標記起來,最後回傳ans
class Solution {
public:
int findCircleNum(vector>& isConnected) {
set v;
queue v1;
int ans = 0;
for (int i = 0; i < isConnected.size(); i++) {
if (v.count(i)) continue;
ans++;
v1.push(i);
while (!v1.empty()) {
int n = v1.front();
v1.pop();
if (v.count(n)) continue;
v.insert(n);
for (int j = 0; j < isConnected[n].size(); j++) {
if (isConnected[n][j] == 1) {
v1.push(j);
}
}
}
}
return ans;
}
};