博客
关于我
【纪中2020.2.19日】模拟赛题解
阅读量:323 次
发布时间:2019-03-03

本文共 1852 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要判断给定的地图是否存在死胡同。死胡同的定义是,从任意一个路面单元格出发,沿着任何一个可行的方向,都能返回到起点而不需要掉头。因此,我们需要检测地图中是否存在环路。

方法思路

我们可以使用广度优先搜索(BFS)来检测是否存在环路。具体步骤如下:

  • 遍历地图中的每个路面单元格。
  • 对于每个路面单元格,使用BFS进行深度优先搜索,检查是否存在环路。
  • 如果在BFS过程中发现一个单元格已经被访问过并且不是当前单元格的父节点,则说明存在环路。
  • 如果存在至少一个环路,则地图有死胡同,输出1;否则输出0。
  • 解决代码

    #include 
    #include
    using namespace std;bool has_cycle(int R, int C, char grid[R+1][C+1], int i, int j, vector
    >& parent, vector
    & visited) { queue
    > q; visited[i][j] = true; q.push({i, j}); parent[i][j] = make_pair(-1, -1); int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; while (!q.empty()) { auto curr = q.front(); q.pop(); int x = curr.first; int y = curr.second; for (int k = 0; k < 4; ++k) { int nx = x + dx[k]; int ny = y + dy[k]; if (nx < 1 || nx > R || ny < 1 || ny > C) continue; if (grid[nx][ny] != '.') continue; if (!visited[nx][ny]) { visited[nx][ny] = true; parent[nx][ny] = make_pair(x, y); q.push({nx, ny}); } else { if (parent[x][y].first != nx || parent[x][y].second != ny) { return true; } } } } return false;}int main() { freopen("okret.in", "r", stdin); freopen("okret.out", "w", stdout); int R, C; scanf("%d %d", &R, &C); char grid[R+1][C+1]; for (int i = 1; i <= R; ++i) { scanf(" %c", &grid[i][1]); for (int j = 2; j <= C; ++j) { scanf(" %c", &grid[i][j]); } } vector
    visited(R+2, false); vector
    > parent(R+2, make_pair(-1, -1)); bool f = true; for (int i = 1; i <= R; ++i) { for (int j = 1; j <= C; ++j) { if (grid[i][j] == '.') { if (!has_cycle(R, C, grid, i, j, parent, visited)) { continue; } else { f = false; break; } } } if (!f) break; } if (f) { cout << 0; } else { cout << 1; }}

    代码解释

  • 读取输入:读取地图的大小R和C,然后读取地图数据。
  • 初始化数组:创建两个数组visitedparent来记录单元格的访问状态和父节点。
  • 遍历每个单元格:对于每个路面单元格,调用BFS函数进行环路检测。
  • BFS函数:从当前单元格出发,进行BFS,检查是否存在环路。如果存在环路,返回True。
  • 判断结果:如果存在环路,输出1,否则输出0。
  • 转载地址:http://dcim.baihongyu.com/

    你可能感兴趣的文章
    NYOJ 1066 CO-PRIME(数论)
    查看>>
    NYOJ 737:石子合并(一)(区间dp)
    查看>>
    nyoj 91 阶乘之和(贪心)
    查看>>
    nyoj------203三国志
    查看>>
    NYOJ-525 一道水题
    查看>>
    NYOJ127星际之门(一)
    查看>>
    nyoj58 最少步数
    查看>>
    N皇后问题
    查看>>
    N皇后问题
    查看>>
    n种方式教你用python读写excel等数据文件
    查看>>
    OAuth 2.0 MAC Tokens
    查看>>
    OAuth 及 移动端鉴权调研
    查看>>
    OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
    查看>>
    OAuth2 Provider 项目常见问题解决方案
    查看>>
    OAuth2 vs JWT,到底怎么选?
    查看>>
    Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>