做建材营销型网站,家居装修设计,空白网站怎么做,南浔区住房和城乡建设网站问题代码#include iostream
#include vector
#include stack
using namespace std;
//算法思路#xff1a;既能流向大西洋 #xff0c;又能流向太平洋 #xff0c;并且水往低处流
//正向寻找这样的点线会使得代码复杂#xff0c;时间复杂度较大O((…问题代码#include iostream#include vector#include stackusing namespace std;//算法思路既能流向大西洋 又能流向太平洋 并且水往低处流//正向寻找这样的点线会使得代码复杂时间复杂度较大O((mn)*(mn))//反向思路使用非递归DFS递归DFS可能会因网格过深导致栈溢出所以用栈模拟递归实现更加稳定class Solution {private:// 定义4个方向上下左右行和列的偏移量vectorvectorint dirs { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };// 存储网格的总行数和总列数int rows, cols;//heights 地形高度网格,visited 标记数组记录该位置是否能到达对应海洋//y 当前起始点的列坐标,x 当前起始点的行坐标// 坐标合法性检查判断(r,c)是否在网格内bool isValid(int x ,int y) {return x 0 x rows y 0 y cols;}void dfs_iter(vectorvectorint heights, int x, int y, vectorvectorbool visited) {// 用栈来模拟递归存储待访问的坐标stackpairint, int st;//栈的初始化 使得可存储坐标对类型st.push({x, y});// 起始点入栈visited[x][y] true;//标记为已访问,避免重复// 栈不为空时循环非递归DFS的核心while (!st.empty()) {// 取出栈顶元素当前访问的坐标// 取出栈顶的pair对象pairint, int cur st.top();st.pop();// 分别赋值给cur_x和cur_yint cur_x cur.first;int cur_y cur.second;// 遍历4个方向for (auto dir : dirs) {// 计算相邻位置的坐标int nx cur_x dir[0], ny cur_y dir[1];// 边界条件判断// 1. 坐标在网格范围内// 2. 该位置未被访问过// 3. 相邻位置的高度 当前位置高度水往低处流反向就是高处能流向当前处if (nx 0 nx rows ny 0 ny cols !visited[nx][ny] heights[nx][ny] heights[cur_x][cur_y]) {// 标记该位置可到达并入栈等待后续遍历visited[nx][ny] true;st.push({nx, ny});}}}}public:/*** 找出既能流向太平洋又能流向大西洋的所有位置* param heights 地形高度网格* return 满足条件的坐标列表*/vectorvectorint pacificAtlantic(vectorvectorint heights) {// 存储最终结果满足条件的坐标对vectorvectorint res;// 边界处理如果网格为空直接返回空结果if (heights.empty()) return res;// 初始化总行数和总列数rows heights.size(), cols heights[0].size();// pacific[i][j]标记(i,j)位置的水能否流向太平洋vectorvectorbool pacific(rows, vectorbool(cols, false));// atlantic[i][j]标记(i,j)位置的水能否流向大西洋vectorvectorbool atlantic(rows, vectorbool(cols, false));// 初始化边界从太平洋的边界开始DFS// 第一行顶部边界的所有位置都能直接流向太平洋for (int j 0; j cols; j) {dfs_iter(heights, 0, j, pacific);// 最后一行底部边界的所有位置都能直接流向大西洋dfs_iter(heights, rows-1, j, atlantic);}// 初始化边界从大西洋的边界开始DFS// 第一列左侧边界的所有位置都能直接流向太平洋for (int i 0; i rows; i) {dfs_iter(heights, i, 0, pacific);// 最后一列右侧边界的所有位置都能直接流向大西洋dfs_iter(heights, i, cols-1, atlantic);}// 补充原代码缺失了结果收集的逻辑这里补上for (int i 0; i rows; i) {for (int j 0; j cols; j) {// 如果一个位置既能流向太平洋又能流向大西洋加入结果if (pacific[i][j] atlantic[i][j]) {res.push_back({i, j});}}}return res;}};int main() {vectorvectorint heights {{1, 2, 2, 3, 5},{3, 2, 3, 4, 4},{2, 4, 5, 3, 1},{6, 7, 1, 4, 5},{5, 1, 1, 2, 4}};Solution sol;vectorvectorint res sol.pacificAtlantic(heights);cout 沿海生态保护区规划 - 关键水资源连通区域 endl;cout 场景说明这些区域是海陆水资源循环的核心对生态保护至关重要 endl;cout 关键区域坐标行, 列 endl;for (auto pos : res) {cout ( pos[0] , pos[1] ) endl;}cout endl;return 0;}思路解释寻求既能流向太平洋又能流向大西洋的点按照水往低处流的自然规律进行正向解决过于复杂时间复杂度Omn*mn遂采取反向搜索从边界出发从小到大分别寻找可以流入大西洋和太平洋的点并取两个集合的交集保证其既能流入大西洋又能流入太平洋。因为递归DFS方法可能因为网格过深而导致溢出所以采用栈模拟DFS方法。先定义网格的行列以及网格遍历周围点的移动数组并且设置循环检验点的合法化然后定义初始化栈并且设置起始点入栈并且进行标记然后对不控的站进行处理先取出栈顶元素然后重新设置一个值分别表示为取出的栈顶的点的行纵坐标经过移动的值依次遍历取出点上下左右四个方向的点是否满足在网格内并且周围点的值大于取出点的值然后用atlantic标记大西洋用pacific标记太平洋最后去两个集合的交集得出测试结果