DFS 迷宫

个人感觉DFS没有递归那么烧脑

简单迷宫 

如何接受二维数组 

先构建A[MAXN][MAXN],人后二重循环

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const int N=13,maxn=10;
int n=2,m=2;
int wi[N]={1,2},C[maxn][maxn],D[maxn][maxn]={0};int ans=0;
void dfs(int r,int c)
{//printf("(%d,%d)",r,c);if(r==n-1 and c==m-1) {ans++;return;}else{
if(r+1<n){if(!C[r+1][c] && !D[r+1][c]) {D[r+1][c]=1;dfs(r+1,c);D[r+1][c]=0;}}
if(r-1>=0){if(!C[r-1][c] && !D[r-1][c]) {D[r-1][c]=1;dfs(r-1,c);D[r-1][c]=0;}}
if(c+1<m){if(!C[r][c+1] && !D[r][c+1]) {D[r][c+1]=1;dfs(r,c+1);D[r][c+1]=0;}}
if(c-1>=0){if(!C[r][c-1] && !D[r][c-1]) {D[r][c-1]=1;dfs(r,c-1);D[r][c-1]=0;}}return;				}}int main()
{D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&C[i][j]);}
//printf("?"); 
dfs(0,0);printf("%d",ans);
//for(int i=0;i<T.size();i++)printf("@%d@",T[i]);
}

参考答案:

1.把方案放入列表 

2.dfs执行立刻置dfs(i,j)的visit1

#include <cstdio>const int MAXN = 5;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int counter = 0;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !visited[x][y];
}void DFS(int x, int y) {if (x == n - 1 && y == m - 1) {counter++;return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {DFS(nextX, nextY);}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}DFS(0, 0);printf("%d", counter);return 0;
}

矩阵权值最大路径 

写死我了,四个方向,每个方向都写一遍

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const int N=13,maxn=10;
int n=2,m=2,k;
int wi[N]={1,2},C[maxn][maxn]={0},D[maxn][maxn]={0},W[maxn][maxn];
int step=0;
int ans=-101;
int w0;
vector<int> row,col,ans_R,ans_C;
void dfs(int r,int c)
{//printf("(%d,%d)",r,c);
//printf("?");if(r==n-1 and c==m-1) {if(ans<w0) {ans=w0,ans_R=row;ans_C=col;}return;}else{
if(r+1<n){if(!C[r+1][c] && !D[r+1][c]) {//printf("1");
D[r+1][c]=1;w0+=W[r+1][c];row.push_back(r+1);col.push_back(c);
dfs(r+1,c);
row.pop_back();col.pop_back();w0-=W[r+1][c];D[r+1][c]=0;}}
if(r-1>=0){if(!C[r-1][c] && !D[r-1][c]) {//printf("2");
D[r-1][c]=1;w0+=W[r-1][c];row.push_back(r-1);col.push_back(c);
dfs(r-1,c);
row.pop_back();col.pop_back();w0-=W[r-1][c];D[r-1][c]=0;}}
if(c+1<m){if(!C[r][c+1] && !D[r][c+1]) {//printf("3");
D[r][c+1]=1;w0+=W[r][c+1];row.push_back(r);col.push_back(c+1);
dfs(r,c+1);
row.pop_back();col.pop_back();w0-=W[r][c+1];D[r][c+1]=0;}}
if(c-1>=0){if(!C[r][c-1] && !D[r][c-1]) {//printf("4");
D[r][c-1]=1;w0+=W[r][c-1];row.push_back(r);col.push_back(c-1);
dfs(r,c-1);
row.pop_back();col.pop_back();w0-=W[r][c-1];D[r][c-1]=0;}}return;				}}int main()
{D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&W[i][j]);}
w0=W[0][0];
//printf("?"); 
dfs(0,0);
printf("1 1\n");
//printf("%d",ans);
//for(vector<int>::iterator it=ans_R.begin();it!=ans_R.end();it++)
for(int i=0;i<ans_R.size();i++)
{printf("%d %d",ans_R[i]+1,ans_C[i]+1);if(i<ans_R.size()-1) printf("\n");
}
}

答案用了循环写的

#include <cstdio>
#include <vector>
#include <utility>
using namespace std;typedef pair<int, int> Position;const int MAXN = 5;
const int INF = 0x3f;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int maxValue = -INF;
vector<Position> tempPath, optPath;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && !visited[x][y];
}void DFS(int x, int y, int nowValue) {if (x == n - 1 && y == m - 1) {if (nowValue > maxValue) {maxValue = nowValue;optPath = tempPath;}return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {int nextValue = nowValue + maze[nextX][nextY];tempPath.push_back(Position(nextX, nextY));DFS(nextX, nextY, nextValue);tempPath.pop_back();}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}tempPath.push_back(Position(0, 0));DFS(0, 0, maze[0][0]);for (int i = 0; i < optPath.size(); i++) {printf("%d %d\n", optPath[i].first + 1, optPath[i].second + 1);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型操作系统内核源码详解系列五(2):cm3下栈的初始化

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

windows反弹shell的方法

什么是正向shell和反向shell 首先说&#xff0c;正向shell是控制端主动连接被控制端&#xff0c;通过目标主机开放一个监听端口等待其他主机访问&#xff0c;从而获得对目标主机的shell访问&#xff0c;优点是控制端可以整个控制目标主机&#xff0c;但缺点会受到防火墙的连&a…

手机usb共享网络电脑没反应的方法

适用于win10电脑&#xff0c;安卓手机上可以 开启usb网络共享选择&#xff0c;如果选择后一直跳&#xff0c;让重复选择usb选项的话&#xff0c;就开启 开发者模式&#xff0c;进到 开发者模式 里设置 默认usb 共享网络 选项 &#xff0c;就不会一直跳让你选。 1.先用数据线 连…

如何通过Appium连接真机调试

1、打开appium&#xff0c;点击启动appium服务器&#xff08;如图1&#xff09; 2、appium启动成功后&#xff0c;点击放大镜启动检查会话&#xff08;如图2&#xff09; 3、填写真机设备信息和APP的package、activity,点击启动会话&#xff08;如图3&#xff09; 4、打开运行A…

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…

Swift Combine — Subject Publishers(PassthroughSubject CurrentValueSubject)

本文主要介绍一下Subject&#xff0c;Subject 本身也是一个 Publisher&#xff0c;其定义如下&#xff1a; public protocol Subject<Output, Failure> : AnyObject, Publisher {func send(_ value: Self.Output)func send(completion: Subscribers.Completion<Self.…

【漏洞复现】泛微OA E-Cology ln.FileDownload 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

JAVA开发 选择本地的文件,控制台输出选择的文件名

打开文件选择器对话框&#xff0c;控制台输出选择的文件 1、展示效果2、实现代码3、JFileChooser类 1、展示效果 2、实现代码 import javax.swing.*; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date;public class GenerateCompress {public sta…

强大的api管理系统Storm Core API_V1.1免授权源码

强大的api管理系统Storm Core API_V1.1免授权源码&#xff0c;带用户key和ip白名单功能 可设置付费操作等 更新日志 此次更新功能比较多 1.完善个人中心页面 2.完善注册登录页面 3.完善key功能 4.增加ip白名单功能 5.以及一些其他小小的美化 6.模板dxx的图片可单个自定…

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)AWS

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言 2. 创建AWS账户 3. EC2 3.1 启动 EC2 新实例 3.1.1 入口 3.1.2 设置名称 选择服务 3.1.3 创建密钥对 3.1.4 网络设置——安全组 3.1.4.1 初始设置 3.1.4.2 添加安全组规则&#xff08;开放新…

【Linux】MySQL下载与安装

1. 下载压缩包 官网下载 2. 解压 上传并解压好放在指定位置 创建soft文件夹 mkdir /soft上传文件&#xff0c;在该目录下再创建一个mysql文件夹&#xff0c;将安装包解压到新文件夹中 mkdir /soft/mysql-8.3.0 tar -xvf mysql-8.3.0-1.el9.x86_64.rpm-bundle.tar -C mysq…

C语言 | Leetcode C语言题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; int findPeakElement(int* nums, int numsSize) {int ls_max0;for(int i1;i<numsSize;i){if(nums[ls_max]>nums[i]);else{ls_maxi;}}return ls_max; }

2024上海初中生古诗文大会倒计时4个月:单选题真题和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

演示:WPF开发的Diagram自动化流程图应用

一、目的&#xff1a;演示Diaram应用功能 二、预览 三、功能列表 功能模块 通用测试 流程图 仪器仪表 机器人 网络通信测试 PLC测试 轮毂生产线流程测试 图像处理 目标检测 绘图 思维导图 图表 流程图功能 模板管理 工程管理 模块许可管理 工具栏 开始 停止 删除 清除 …

RabbitMQ实践——对不可路由的消息的处理方法

大纲 无备用&#xff08;Alternate&#xff09;交换器构建交换器、队列和绑定关系测试代码抛弃不可路由消息返还不可路由消息 有备用&#xff08;Alternate&#xff09;交换器创建带备用&#xff08;Alternate&#xff09;交换器的交换器mandatory非mandatory 总结 在实际工作中…

【DevOps】Elasticsearch 数据跨集群同步方案

目录 1、Elasticsearch Cross-Cluster Replication (CCR) 1.1、优点 1.2、缺点 1.3、步骤 1.4、示例 2. Logstash 或其他 ETL 工具 2.1、优点 2.2、缺点 2.3、步骤 3. Apache Kafka 或 RabbitMQ 3.1、优点 3.2、缺点 3.3、步骤 4、使用 Reindex API 进行跨集群同…

【LeetCode最详尽解答】42-接雨水 Trapping-Rain-Water

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接: 42-接雨水 直觉 通过可视化图形来解决这个问题会更容易理解和解决。 给定输入: height [0,1,…

mediasoup源码分析--channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中&#xff0c;已经介绍过信令服务中tcp和channel的创建&#xff0c;本文主要讲解c中mediasoup的channel创建&#xff0c;以及信令服务和medi…

基于CentOS的全新Linux机器安装Jenkins并生成Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 一、安装Docker 在CentOS上&#xff0c;首先更新包管理工具并安装所需的包。 sudo yum update…

12.3 Go 测试覆盖率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…