北京网站备案在哪,阿里巴巴网站基础建设首保服务,网页制作站点,个性菜单 wordpress目录
841.钥匙和房间
思路#xff1a;本题是一个有向图搜索全路径的问题。 只能用深搜#xff08;DFS#xff09;或者广搜#xff08;BFS#xff09;来搜。
463. 岛屿的周长 841.钥匙和房间
力扣题目链接
(opens new window)
有 N 个房间#xff0c;开始时你位于 0…
目录
841.钥匙和房间
思路本题是一个有向图搜索全路径的问题。 只能用深搜DFS或者广搜BFS来搜。
463. 岛屿的周长 841.钥匙和房间
力扣题目链接
(opens new window)
有 N 个房间开始时你位于 0 号房间。每个房间有不同的号码012...N-1并且房间里可能有一些钥匙能使你进入下一个房间。
在形式上对于每个房间 i 都有一个钥匙列表 rooms[i]每个钥匙 rooms[i][j] 由 [0,1...N-1] 中的一个整数表示其中 N rooms.length。 钥匙 rooms[i][j] v 可以打开编号为 v 的房间。
最初除 0 号房间外的其余所有房间都被锁住。
你可以自由地在房间之间来回走动。
如果能进入每个房间返回 true否则返回 false。
示例 1
输入: [[1],[2],[3],[]]输出: true解释: 我们从 0 号房间开始拿到钥匙 1。 之后我们去 1 号房间拿到钥匙 2。 然后我们去 2 号房间拿到钥匙 3。 最后我们去了 3 号房间。 由于我们能够进入每个房间我们返回 true。
示例 2
输入[[1,3],[3,0,1],[2],[0]]输出false解释我们不能进入 2 号房间。 思路本题是一个有向图搜索全路径的问题。 只能用深搜DFS或者广搜BFS来搜。 //深度优先
class Solution {
public:
void dfs(vectorvectorint rooms, int key, vectorbool visited){if(visited[key])return;visited[key]true;vectorintkeys rooms[key];for(int key: keys){dfs(rooms, key, visited);}}bool canVisitAllRooms(vectorvectorint rooms) {vectorboolvisited(rooms.size(), false);dfs(rooms, 0, visited);for(int i : visited){if (ifalse) return false;}return true;}
}; //广度优先版
class Solution {
public:bool bfs(vectorvectorint rooms){vectorintvisited(rooms.size(),0);queueintque;visited[0]1;//初始化从第一个房间‘0’开始que.push(0);while(!que.empty()){int key que.front();que.pop();vectorintkeysrooms[key];for(int key: keys){if(!visited[key]){que.push(key);visited[key]1;}}}for(int i:visited){if(!i)return false;}return true;}bool canVisitAllRooms(vectorvectorint rooms) {return bfs(rooms);}
}; 463. 岛屿的周长
力扣题目链接
给定一个 row x col 的二维网格地图 grid 其中grid[i][j] 1 表示陆地 grid[i][j] 0 表示水域。
网格中的格子 水平和垂直 方向相连对角线方向不相连。整个网格被水完全包围但其中恰好有一个岛屿或者说一个或多个表示陆地的格子相连组成的岛屿。
岛屿中没有“湖”“湖” 指水域在岛屿内部且不和岛屿周围的水相连。格子是边长为 1 的正方形。网格为长方形且宽度和高度均不超过 100 。计算这个岛屿的周长。 输入grid [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]输出16解释它的周长是上面图片中的 16 个黄色的边
示例 2
输入grid [[1]]输出4
示例 3
输入grid [[1,0]]输出4 思路遍历地图遇到岛屿遍历其上下左右四个方向如果遇到边界或者遇到水域grid[nextx][nexty]0)result; class Solution {
public:int dir[4][2] {0, 1, 1, 0, 0, -1, -1, 0};int islandPerimeter(vectorvectorint grid) {int result 0;for (int i 0; i grid.size(); i) {for (int j 0; j grid[0].size(); j) {if (grid[i][j] 1) { // 遇到陆地for (int k 0; k 4; k) { // 搜索各个方向int nextx i dir[k][0];int nexty j dir[k][1];if (nextx 0 || nextx grid.size() || nexty 0 ||nexty grid[0].size() ||grid[nextx][nexty] 0) { // 遇到边界或者水域周长result;}}}}}return result;}
}; 参考代码随想录