当前位置: 首页 > news >正文

【走迷宫】

题目

b94c7562f57448aa8b31b046531adf9f.png

DFS代码

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int matrix[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dis[N][N];
void dfs(int x, int y, int cnt)
{if(cnt > dis[n-1][m-1]) return;if(x == n-1 && y == m-1) return;for(int i = 0; i < 4; i++){int nx = x + dx[i], ny = y + dy[i];if(nx < 0 || ny < 0 || nx >= n || ny >= m || matrix[nx][ny]) continue;if(dis[nx][ny] > dis[x][y] + 1){dis[nx][ny] = dis[x][y] + 1;dfs(nx, ny, cnt+1);}}
}
int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d", &matrix[i][j]);}}memset(dis, 0x3f, sizeof dis);        dis[0][0] = 0;dfs(0, 0, 0);cout << dis[n-1][m-1];return 0;
}

优化:

1.if(cnt >= res) return; (较好)

2.if(dis[x][y] < cnt) return; (较好)
   else dis[x][y] = cnt;

3.         if(dis[nx][ny] > dis[x][y] + 1) (非常好)
        {
            dis[nx][ny] = dis[x][y] + 1;
            dfs(nx, ny, cnt+1);
        }

优化1+优化2都不如单用优化3

优化3可以替代优化2,同时可以不需要visited访问数组、cnt参数、res。

优化1可以和优化3搭配(需要cnt参数),效果最好,比单用优化3快一倍。为什么?

注意:优化2中和优化3中均不能加等号,前者会导致错误,后者会TLE。为什么?

 

 

 

BFS代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define f first
#define s secondconst int N = 110;
int g[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dis[N][N];
int bfs(int a, int b)
{queue<PII> q;q.push({a,b});dis[a][b] = 0;while(q.size()){PII u = q.front();q.pop();for(int i = 0; i < 4; i++){int nx = u.f + dx[i], ny = u.s + dy[i];if(nx >= 0 && ny >= 0 && nx < n && ny < m && !g[nx][ny] && dis[nx][ny] == -1){q.push({nx, ny});dis[nx][ny] = dis[u.f][u.s] + 1;}}}return dis[n-1][m-1];
}
int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d", &g[i][j]);}}memset(dis, -1, sizeof dis);cout << bfs(0, 0);return 0;
}

数组实现

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define f first
#define s secondconst int N = 110;
int g[N][N];
PII q[N * N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dis[N][N];
int bfs(int a, int b)
{int h = 0, t = 0;q[0] = {a, b};dis[a][b] = 0;while(h <= t){auto u = q[h++];for(int i = 0; i < 4; i++){int nx = u.f + dx[i], ny = u.s + dy[i];if(nx >= 0 && ny >= 0 && nx < n && ny < m && !g[nx][ny] && dis[nx][ny] == -1){q[++t] = {nx, ny};dis[nx][ny] = dis[u.f][u.s] + 1;}}}return dis[n-1][m-1];
}
int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d", &g[i][j]);}}memset(dis, -1, sizeof dis);cout << bfs(0, 0);return 0;
}

 

 

http://www.lryc.cn/news/423357.html

相关文章:

  • linux(debian)迁移var数据到已分配逻辑卷的物理盘
  • 【产品那些事】什么是应用程序安全态势管理(ASPM)?
  • cocosUI多分辨率适配
  • 无法加载到主类
  • 深入理解Kafka核心设计与实践原理_03
  • MySQL- 覆盖索引
  • JSON与EXL文件互转
  • 后台管理权限自定义按钮指令v-hasPermi
  • 【Python绘制散点图并添加趋势线和公式以及相关系数和RMSE】
  • linux bridge VLAN
  • Java进阶篇之深入理解多态的概念与应用
  • Linux下的进程调度队列
  • 统计回归与Matlab软件实现上(一元多元线性回归模型)
  • 【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统
  • 随机生成 UUID
  • 报名表EXCEL图片批量下载源码-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
  • SpringBoot 整合 Elasticsearch 实现商品搜索
  • 计算机毕业设计 助农产品采购平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • Django后台数据获取展示
  • innodb 如何保证数据的一致性?
  • Oracle-OracleConnection
  • 基于hadoop的网络流量分析系统的研究与应用
  • 【C# WPF WeChat UI 简单布局】
  • 关于docker的几个概念(二)
  • JAVA集中学习第五周学习记录(一)
  • JavaSE 网络编程
  • ubuntu24.04 编译安装PHP7.4
  • Tied and Anchored Stereo Attention Network for Cloud Removal in Optical
  • 云开发微信小程序--即时聊天(单人聊天,多人聊天室)
  • Leetcod编程基础0到1-基础实现内容(个人解法)(笔记)