12,递归,迷宫问题

思路:走迷宫问题时要设置一个策略,如(上,下,左,右),如果改点走不通再回溯

c#实现如下:

using System;
using System.Text.RegularExpressions;

namespace 数据结构
{
    //迷宫
    public class MiGong
    {
       static void Main(string[] args)
        {
            //地图
            int[,] map = new int[8, 8];
            for (int j = 0; j < 8; j++)
            {
                map[0, j] = 1;
                map[7, j] = 1;
            }
            for (int i = 1; i < 7; i++)
            {
                map[i, 0] = 1;
                map[i, 7] = 1;
            }
            //设置挡板
            map[2, 1] = 1;
            map[2, 2] = 1;
            map[2, 3] = 1;
            //map[1, 4] = 1;

            //打印地图
            Console.WriteLine("迷宫地图");
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    Console.Write(map[i,j]);
                }
                Console.WriteLine();
            }

            SetWay(map, 1, 1);

            //打印地图
            Console.WriteLine("");
            Console.WriteLine("迷宫走过路径地图");
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    Console.Write(map[i, j]);
                }
                Console.WriteLine();
            }
        }

        //递归回溯找出路
        //map[1,1]入口,开始位置
        //map[6,6]出口,结束位置
        //约定:1表示墙,2表示走得通,3表示探测过走不通
        public static bool SetWay(int[,] map, int i, int j)
        {
            //已经找到出口
            if (map[6, 6] == 2)
            {
                return true;
            }
            if (map[i, j] == 0)
            {
                //假设map[i, j],走得通
                map[i, j] = 2;
                if (SetWay(map, i + 1, j))//向下找
                {
                    return true;
                }
                else if (SetWay(map, i, j + 1))//向右找
                {
                    return true;
                }
                else if (SetWay(map, i - 1, j))//向上向找
                {
                    return true;
                }
                else if (SetWay(map, i, j - 1))//向左找
                {
                    return true;
                }
                else
                {
                    //走不通,回溯
                    map[i, j] = 3;
                    return false;
                }
            }
            else
            {
                //1,2,3情况
                return false;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/xiaojvhuang/p/13345288.html