求给出走迷宫是否可走通的代码?迷宫用0,1数组Map[20,20],,1标示墙体,0标示路;
从(0,0)走到(19,19);
我写了一段出不来效果?
        private void visit(int i, int j)
        {
            int endI=19,endJ=19;
            Map[i,j] = 2;
            if (i == endI && j == endJ)
            {
                CanGo=true ;
                return;
            }
            if (j<19 && Map[i,j + 1] == 0) visit(i, j + 1);
            if (i < 19 &&  Map[i + 1, j] == 0) visit(i + 1, j);
            if (j >0 && Map[i, j - 1] == 0) visit(i, j - 1);
            if (i > 0 && Map[i - 1, j] == 0) visit(i - 1, j);
            Map[i,j] = 0;
        } 主函数
CanGo=false ;
visit(0, 0);
后判断全局CanGo是否真可知迷宫是否可走通

解决方案 »

  1.   

    这种算法会容易绕圈圈,容易陷入无路可走的地步。应该在visit 函数中再增加 在无路可走的情况下,可后退 。走过的路径用 Stack<Point> list 表示,无路时退栈。
      

  2.   

    如下该就可以了
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace Can_go
    {
        class Program
        {
            private int [,]Map=new int[20,20];
            private int endI=19,endJ=19;
            private bool CanGo = false;
            private void visit(int i, int j) 
            {             
                Map[i,j] = 2; //走的踪迹路线
                if (i == endI && j == endJ) 
                { 
                    CanGo=true ; 
                    return; 
                } 
                if (j <19 && Map[i,j + 1] == 0) visit(i, j + 1); 
                if (i < 19 &&  Map[i + 1, j] == 0) visit(i + 1, j); 
                if (j >0 && Map[i, j - 1] == 0) visit(i, j - 1); 
                if (i > 0 && Map[i - 1, j] == 0) visit(i - 1, j); 
                //Map[i,j] = 0;
                //Console.Write("({0},{1})", i, j); 
            }
            private void createmap()
            {
                Random random = new Random();
                for (int i = 0; i < 20; i++)
                {
                    for (int j = 0; j < 20; j++)
                    {                    int ran = random.Next() % 300;
                        Map[i, j] = (ran > 100) ? 0 : 1;
                        Console.Write("{0}", Map[i, j]);
                    }
                    Console.WriteLine();
                }
                Map[0, 0] = 0;
                Map[19, 19] = 0;        }
            static void Main(string[] args)
            {
                Program a = new Program();
                a.createmap();
                a.visit(0, 0);
                Console.WriteLine("{0}", a.CanGo);
                Console.Read();         }
        }
    }