C#迷宫算法代码详解

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RewriteMiGong
{
    class Program
    {

        public static void printArray( int[][] m)
        {
            int v = 0;
            for (int j = 0; j<10;j++)
            {
                for (int i = 0; i < 10; i++)
                {

                    v = m[j][i];
                    if (v == 0) Console.Write("正");
                    if (v == 1) Console.Write("■");
                    if (v == 2) Console.Write("Do");
                    if (v == 3) Console.Write("33");

                }
                Console.WriteLine();
            }

        }


        static void Main(string[] args)
        {
            int[][] map = new int[10][];

            map[0] = new int[10] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

            map[1] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

            map[2] = new int[10] { 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 };

            map[3] = new int[10] { 1, 0, 1, 0, 1, 0, 1, 2, 0, 1 };

            map[4] = new int[10] { 1, 1, 1, 1, 1, 0, 1, 1, 0, 1 };

            map[5] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 };

            map[6] = new int[10] { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 };

            map[7] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 };

            map[8] = new int[10] { 0, 0, 1, 0, 1, 0, 0, 0, 0, 1 };

            map[9] = new int[10] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };


            printArray(map);
            Console.ReadKey();

            int dir = 0;
            int step = 0;
            int[] d = new int[100];
            int xx = 0; int yy = 0;

            int x = 0; int y = 8;

            do
            {
                
                dir++;
                if (dir > 4)
                {
                    dir = d[step - 1];

                    if (dir == 1) x--;
                    if (dir == 2) y++;
                    if (dir == 3) x++;
                    if (dir == 4) y--;
                    step--;
                    continue;
                     

                }



                xx = x; yy = y;

                if (dir == 1) xx++;
                if (dir == 2) yy--;
                if (dir == 3) xx--;
                if (dir == 4) yy++;

                if (map[yy][xx] == 2)
                {
                    Console.WriteLine("成功");
                    Console.ReadKey();

                }

                if (map[yy][xx] != 0)
                {

                    continue;

                }

                if (map[yy][xx] == 0)
                {

                    d[step] = dir;
                    
                    map[yy][xx] = 3;
                    dir = 0;

                    x = xx;
                    y = yy;
                    step++;

                    printArray(map);

                }
               


            } while (true);

            
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RewriteMiGong
{
    class Program
    {

        public static void printArray( int[][] m)
        {
            int v = 0; //定义一个v 这个v在下文中有v = 0 1 2 3 4几种情况 
            for (int j = 0; j<10;j++)
            {
                for (int i = 0; i < 10; i++)
                {

                    v = m[j][i];
                    if (v == 0) Console.Write("正"); //当数组==0时 输出“正”道路
                    if (v == 1) Console.Write("■");//墙
                    if (v == 2) Console.Write("Do");//终点
                    if (v == 3) Console.Write("33");//路径

                }
                Console.WriteLine();//此处为当i循环10次后 换一次行
            }

        }


        static void Main(string[] args)
        {
            int[][] map = new int[10][];//新建一个数列为10的map数组 同时写出10行数列 这样地图长宽是10X10

            map[0] = new int[10] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

            map[1] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

            map[2] = new int[10] { 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 };

            map[3] = new int[10] { 1, 0, 1, 0, 1, 0, 1, 2, 0, 1 };

            map[4] = new int[10] { 1, 1, 1, 1, 1, 0, 1, 1, 0, 1 };

            map[5] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 };

            map[6] = new int[10] { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 };

            map[7] = new int[10] { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 };

            map[8] = new int[10] { 0, 0, 1, 0, 1, 0, 0, 0, 0, 1 };

            map[9] = new int[10] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };


            printArray(map);//初始化一次map 让map套用printArray方法
            Console.ReadKey();//空格继续

            int dir = 0;//定义方向 direction
            int step = 0;//定义步数
            int[] d = new int[100];//定义一个数组用于 记录每一步的方向
            int xx = 0; int yy = 0; xx  yy是下一步

            int x = 0; int y = 8;  坐标(0,8)是开始点  x y是当前步数

//我用的是do循环

            do
            {
                
                dir++;//dir控制方向  dir与xx yy这种下一步参数有关 当 dir变化的时候 xx 或yy会发生变化
                if (dir > 4)//这里是当 dir经历了上下左右时 需后退的情况
                {
                    dir = d[step - 1];

                    if (dir == 1) x--;//这里要注意是x而不是xx
                    if (dir == 2) y++;
                    if (dir == 3) x++;
                    if (dir == 4) y--;
                    step--;
                    continue;
                     

                }

 

                xx = x; yy = y;

                if (dir == 1) xx++;
                if (dir == 2) yy--;
                if (dir == 3) xx--;
                if (dir == 4) yy++;

                if (map[yy][xx] == 2)//找到终点
                {
                    Console.WriteLine("成功");
                    Console.ReadKey();

                }

                if (map[yy][xx] != 0)// 遇到的不是道路 即如果碰到墙或者退路
                {

//这个时候会循环到dir++ 会改变yy或者xx的值

                    continue;

                }

                if (map[yy][xx] == 0)//遇到道路
                {

 

                    d[step] = dir; //用d【step】记录下每一步方向
                    
                    map[yy][xx] = 3;//这里给退路的坐标赋值3  这样就可以分辨退路与前进的道路
                    dir = 0;//方向初始化

                    x = xx;用x继承 xx的值
                    y = yy;
                    step++;

                    printArray(map);

                }
               


            } while (true);

            
        }
    }
}

 

你可能感兴趣的:(C#迷宫算法代码详解)