C#,老鼠迷宫问题的回溯法求解(Rat in a Maze)算法与源代码

news/2024/7/15 17:06:36 标签: 算法, 图论

1 老鼠迷宫问题

迷宫中的老鼠,作为另一个可以使用回溯解决的示例问题。

迷宫以块的N×N二进制矩阵给出,其中源块是最左上方的块,即迷宫[0][0],目标块是最右下方的块,即迷宫[N-1][N-1]。老鼠从源头开始,必须到达目的地。老鼠只能朝两个方向移动:向前和向下。

在迷宫矩阵中,0表示该块是死胡同,1表示该块可用于从源到目标的路径。请注意,这是典型迷宫问题的简单版本。例如,更复杂的版本可以是rat可以在4个方向上移动,而更复杂的版本可以具有有限的移动次数。

2 老鼠迷宫问题的回溯法求解

(1)创建一个解决方案矩阵,最初用0填充。

(2)创建一个递归函数,该函数采用初始矩阵、输出矩阵和rat(i,j)的位置。

(3)如果位置超出矩阵或位置无效,则返回。

(4)将位置输出[i][j]标记为1,并检查当前位置是否为目标位置。如果到达目的地,打印输出矩阵并返回。

(5)递归调用位置(i+1,j)和(i,j+1)。

(6)取消标记位置(i,j),即输出[i][j]=0。

3 源程序

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static class Rat_In_Maze_Problem
    {
        private static bool Rate_In_Maze_IsSafe(int[,] maze, int x, int y)
        {
            int N = maze.GetLength(0);
            return (x >= 0 && x < N && y >= 0 && y < N && maze[x, y] == 1);
        }

        public static bool Rate_In_Maze_Solve(int[,] maze, out int[,] sol)
        {
            int N = maze.GetLength(0);
            sol = new int[N, N];
            if (Rate_In_Maze_Utility(maze, 0, 0,ref sol) == false)
            {
                return false;
            }
            return true;
        }

        private static bool Rate_In_Maze_Utility(int[,] maze, int x, int y,ref int[,] sol)
        {
            int N = maze.GetLength(0);
            if (x == N - 1 && y == N - 1 && maze[x, y] == 1)
            {
                sol[x, y] = 1;
                return true;
            }

            if (Rate_In_Maze_IsSafe(maze, x, y))
            {
                if (sol[x, y] == 1)
                {
                    return false;
                }
                sol[x, y] = 1;
                if (Rate_In_Maze_Utility(maze, x + 1, y,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x, y + 1,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x - 1, y,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x, y - 1,ref sol))
                {
                    return true;
                }
                sol[x, y] = 0;
                return false;
            }
            return false;
        }
    }
}
 

4 源代码

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static class Rat_In_Maze_Problem
    {
        private static bool Rate_In_Maze_IsSafe(int[,] maze, int x, int y)
        {
            int N = maze.GetLength(0);
            return (x >= 0 && x < N && y >= 0 && y < N && maze[x, y] == 1);
        }

        public static bool Rate_In_Maze_Solve(int[,] maze, out int[,] sol)
        {
            int N = maze.GetLength(0);
            sol = new int[N, N];
            if (Rate_In_Maze_Utility(maze, 0, 0,ref sol) == false)
            {
                return false;
            }
            return true;
        }

        private static bool Rate_In_Maze_Utility(int[,] maze, int x, int y,ref int[,] sol)
        {
            int N = maze.GetLength(0);
            if (x == N - 1 && y == N - 1 && maze[x, y] == 1)
            {
                sol[x, y] = 1;
                return true;
            }

            if (Rate_In_Maze_IsSafe(maze, x, y))
            {
                if (sol[x, y] == 1)
                {
                    return false;
                }
                sol[x, y] = 1;
                if (Rate_In_Maze_Utility(maze, x + 1, y,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x, y + 1,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x - 1, y,ref sol))
                {
                    return true;
                }
                if (Rate_In_Maze_Utility(maze, x, y - 1,ref sol))
                {
                    return true;
                }
                sol[x, y] = 0;
                return false;
            }
            return false;
        }
    }
}

 


http://www.niftyadmin.cn/n/5417081.html

相关文章

机器学习流程—数据预处理 Encoding

机器学习流程—数据预处理 Encoding 在机器学习中,我们经常会遇到分类变量,这些分量变量往往机器学习模型没有办法从中学习,往往有两种,一种是字符型,一种是数值型。通常需要对分类型变量做一些处理,常用的方法有两种:label encoding和one hot encoding。 例如,假设数…

20240308-1-校招前端面试常见问题CSS

校招前端面试常见问题【3】——CSS 1、盒模型 Q&#xff1a;请简述一下 CSS 盒模型&#xff1f; W3C 模式&#xff1a;盒子宽widthpaddingbordermargin 怪异模式&#xff1a;盒子宽widthmargin Q&#xff1a;inline、block、inline-block 元素的区别&#xff1f; inline&am…

Hadoop生态选择(一)

一、项目框架 1.1技术选型 技术选型主要考虑因素:维护成本、总成本预算、数据量大小、业务需求、行业内经验、技术成熟度。 数据采集传输:Flume&#xff0c;Kafka&#xff0c;DataX&#xff0c;Maxwell&#xff0c;Sqoop&#xff0c;Logstash数据存储:MySQL&#xff0c;HDFS…

JAVA实战开源项目:智能停车场管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

Unity或者其他程序启动C#的控制台程序传递参数出错

Unity或者其他程序启动C#的控制台程序传递参数出错 主机启动代码 string exePath path ProConst.ProgramPath_GenerateReportExe;//设置exe启动的路径 string data JsonConvert.SerializeObject(GameManager.Instance._UserTrainingDataEntities);//将对象转成json Proces…

用skopeo检查docker image

文章目录 环境 环境 OCP 4.14.12 yum install skopeo -y在 ibm-dmc-bundle/stable/ibm-dmc-bundle/build/operand_images 处&#xff0c;找到digest号。 比如&#xff0c;找到这一行&#xff1a; DMC_ADDON_API_IMAGE_DIGEST_amd64sha256:f8208890bf4058e17223afe1c40a29df…

Git 开源的版本控制系统-04-branch manage 分支管理

拓展阅读 Subversion 开源的版本控制系统入门介绍 VCS Git 开源的版本控制系统-01-入门使用介绍 Git 开源的版本控制系统-02-base usage 基本用法 Git 开源的版本控制系统-03-时间数据回溯 Git 开源的版本控制系统-04-branch manage 分支管理 Git 开源的版本控制系统-05-…

将Q算法和D算法结合应用到llm解码上之人在回路

将Q算法和D算法结合应用到llm解码上之人在回路 参考地址代码解释 参考地址 https://dongfangyou.blog.csdn.net/article/details/136466609 代码 import numpy as np from tqdm import tqdmfrom sample import net, char2id_dict, get_real_p# 假设的词汇表 VOCABULARY lis…