DFS 迷宫

news2024/11/26 4:32:56

个人感觉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.coloradmin.cn/o/1833821.html

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

相关文章

Ubuntuwin11双系统

一、准备工作 win11与ubuntu20.4双系统安装案例教程,先查看引导模式参数不服则不要安装否则会报异常 查看BIOS引导模式 查看磁盘分区格式 下载Ubuntu镜像 所有版本下载地址,我的华为云镜像ubuntu20.4这个版本地址

【ComfyUI】Stable Diffusion 3 加Controlnet

基于 instantX-research/diffusers_sd3_control: &#x1f917; Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch and FLAX. (github.com) 和 ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers: ComfyUI SD3-Medium ControlNet&#…

HTTPS原理详解新版

http和https区别 附注&#xff1a; &#xff08;1&#xff09;SSL和TLS其实是一个东西&#xff1b; &#xff08;2&#xff09;完整性通过摘要和原文按照一定算法比对 Https的工作流程 加密算法 数据完整性 Https性能优化

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

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

uniapp 微信小程序更改轮播图指示点

仅微信小程序有效 /* #ifdef MP-WEIXIN */// 默认指示点样式wx-swiper .wx-swiper-dot {position: relative;background-color: #ffffff;width: 28rpx;border-radius: 10rpx;height: 8rpx;opacity: 0.4;}// 当前选中样式wx-swiper .wx-swiper-dot-active {background-color: #f…

Avalonia for VSCode

1、在VSCode中编辑AvaloniaUI界面&#xff0c;在VSCode中搜索Avalonia&#xff0c;并安装。如下图&#xff0c;可以发现Avalonia for VSCode还是预览版。 2、 创建一个Avalonia 项目。 选择项目类型 输入项目名称 选择项目所在文件夹 打开项目 3、项目架构如下图。 4、builde…

记一次线上jVM调优

文章目录 问题描述问题分析尝试优化业务代码优化方案修改后代码补充点 问题描述 部门调整&#xff0c;接手一个新项目&#xff0c;为方便后续描述叫user-web&#xff0c;随后推动IT降本&#xff0c;要求根据实际业务量调整服务器实例数量和配置&#xff0c;调整前服务器配置为…

docker命令docker desktop 安装 xiaomimi8/awvs14-log4j-2022 详细图文教程

docker命令docker desktop 安装 xiaomimi8/awvs14-log4j-2022 详细图文教程 1. 拉取镜像 通过命令拉取 # 拉取镜像 docker pull xiaomimi8/awvs14-log4j-2022 # 查看镜像 docker images通过doker desktop直接查看镜像 2. 启动镜像 通过命令启动 docker run -it -d -p 13…

SpringBoot购物网站

摘要 随着信息技术的高速发展&#xff0c;二十一世纪的网络技术和网络应用正在快速融入人们的生活&#xff0c;并且由于网络服务以及网络应用日渐普及&#xff0c;人们对于现在生活的需求也随之增长&#xff0c;而网上购物的便捷对人们的吸引力越来越大&#xff0c;购物网站可…

阿里云 邮件系统DNS域名解析 搭配 postfix+dovecot 邮件服务器

1 创建邮箱域名A记录(一般邮箱客户端&#xff0c;增加pop,imap,stmp 3条记录) 登录阿里云控制台--云解析DNS 2 MX记录 3 SPF记录

STM32高级控制定时器(STM32F103):PWM输出模式

目录 概述 1 PWM模式介绍 2 PWM类型 2.1 PWM边缘对齐模式 2.2 PWM中心对齐模式 3 使用STM32Cube配置PWM 3.1 STM32Cube配置参数 3.2 生成Project 4 设置PWM占空比 4.1 函数介绍 4.3 函数源码 5 测试代码 5.1 编写测试代码 5.2 函数源码 6 运行代码 概述 本文主…

微信小程序-界面提示框和消息

一.Loading加载框 小程序提供了wx.showLoading用来在加载界面的时候使用&#xff0c;比如加载图片和数据的时候可以使用。 常常和wx.hideLoading()配合使用&#xff0c;否则加载框一直存在。 其效果如下&#xff1a; 代码如下&#xff1a; //显示加载消息wx.showLoading({//提…

编译原理:代替LR的MP:2.遇到的问题

用指针加速 MP是multi-pass&#xff0c;多遍分析法&#xff0c;它是从“先乘除后加减”中得来的灵感。在实践中&#xff0c;发现C语言优先级有15级&#xff0c;如果将源代码处理15遍&#xff0c;每一遍都从头开始找&#xff0c;势必很慢。所以&#xff0c;有了用指针加速的想法…

Vue58-组件的自定义事件_总结

一、需求 父组件App收到子组件student传过来的数据&#xff0c;要在页面上呈现&#xff01; name是App的子组件student&#xff0c;通过自定义事件传过来的。 计算属性&#xff0c;得有原数据才能计算&#xff01;计算的属性要是已经存在的&#xff1a;data里面有的、props里面…

【CSS in Depth2精译】1.1.1 样式表来源

您添加到网页的样式表并非浏览器呈现样式的唯一来源。样式表有三种不同的类型或来源。您添加到页面的样式称为 作者样式&#xff08;author styles&#xff09;&#xff1b;此外还有 用户样式&#xff08;user styles&#xff09;&#xff0c;即终端用户设置的自定义样式&#…

font-spider按需生成字体文件

font-spider可以全局安装,也可以单个项目内安装,使用npm run xxxx的形式 npm i font-spider "dev": "font-spider ./*.html" <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&…

树莓派pico入坑笔记,快捷键键盘制作

使用usb_hid功能制作快捷键小键盘&#xff0c;定义了6个键&#xff0c;分别是 ctrlz ctrlv ctrlc ctrla ctrlw ctrln 对应引脚 board.GP4, board.GP8, board.GP13 board.GP28, board.GP20, board.GP17 需要用到的库&#xff0c;记得复制进单片机存储里面 然后是main主程…

《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()

观前提示&#xff1a;函数完整代码在文末&#xff0c;本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig() 函数介绍&#xff1a; 此函数是一个用于初始化RCC&#xff08;Reset and Clock Control&#xff09;振荡器&#xff08;Osc…

java8实战1(让方法参数具备行为能力)

客户需求是查出颜色为green的苹果 客户需求变成查出颜色为red的苹果 假设现在客户需求又变了,找出黄色的呢?你想查什么颜色直接做为参数输入 让调用者输入颜色参数 问题是现在客户想把重量做为条件,来筛选苹果集合 这就为难了,客户需求随时会变 观察以上例子,发现有个共同…

云计算 | (四)基本云安全

文章目录 📚基本云安全🐇云安全背景🐇基本术语和概念⭐️风险(risk)⭐️安全需求🐇威胁作用者⭐️威胁作用者(threat agent)⭐️匿名攻击者(anonymous attacker)⭐️恶意服务作用者(malicious service agent)⭐️授信的攻击者(trusted attacker)⭐️恶意的内部人员(mal…