走迷宫C#版(一)

原创 2004年06月29日 15:30:00

//迷宫类相关

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;

namespace MazeDemo
{
 /// <summary>
 /// 迷宫类
 /// </summary>
 public class CMaze
 {
  bool[,] mg;  //地图格子
  Stack stack; //堆栈
  Point in_p;  //入口点
  Point out_p; //出口点
  Point start_p; //绘制迷时候的起始点
  Size boxsize; //每个格子的大小
  int step_count; //共走多少步

  public CMaze()
  {
   stack=new Stack();
   this.start_p=new Point(0,0);
   this.boxsize=new Size(50,50);
   step_count=0;
  }

  public CMaze(bool[,] _mg):this()
  {
   this.mg=_mg;
  }

  public CMaze(bool[,] _mg,Point _in,Point _out):this()
  {
   this.mg=_mg;
   this.in_p=_in;
   this.out_p=_out;
   Stack way=this.Test(this.in_p,_in);
   stack.Push(new CCoor(this.in_p,way));
   this.step_count++;
  }


  /// <summary>
  /// 绘制迷宫时窗口的起始坐标
  /// </summary>
  public Point StartPoint
  {
   set{this.start_p=value;}
   get{return this.start_p;}
  }

  /// <summary>
  /// 当前迷宫共走多少步
  /// </summary>
  public int StepCount
  {
   get{return this.step_count;}
  }

  /// <summary>
  /// 迷宫格子大小
  /// </summary>
  public Size BoxSize
  {
   set{this.boxsize=value;}
   get{return this.boxsize;}
  }

  /// <summary>
  /// 堆栈数据个数
  /// </summary>
  public int StackCount
  {
   get{return this.stack.Count;}
  }

  /// <summary>
  /// 绘制迷宫
  /// </summary>
  /// <param name="g"></param>
  public void DrawBox(Graphics g)
  {
   for(int i=0;i<mg.GetLength(0);i++)
   {
    for(int j=0;j<mg.GetLength(1);j++)
    {
     Point pp=new Point((j*BoxSize.Width)+StartPoint.X,(i*BoxSize.Height)+StartPoint.Y); //位置
     SolidBrush brush;
     Rectangle rect=new Rectangle(pp,BoxSize);

     if(mg[i,j])
      brush=new SolidBrush(Color.Green);
     else
      brush=new SolidBrush(Color.Red);
     g.FillRectangle(brush,rect);
    }
   }
  }

  /// <summary>
  /// 绘制所走线路
  /// </summary>
  /// <param name="g"></param>
  public void DrawPath(Graphics g)
  {
   IEnumerator myEnumerator = stack.GetEnumerator();
   while ( myEnumerator.MoveNext() )
   {
    CCoor c=new CCoor();
    c=(CCoor)myEnumerator.Current;
    Point pp=new Point((c.CurrentPoint.Y*BoxSize.Width)+StartPoint.X,(c.CurrentPoint.X*BoxSize.Height)+StartPoint.Y);
    SolidBrush brush=new SolidBrush(Color.Blue);
    Rectangle rect=new Rectangle(pp,BoxSize);
    g.FillRectangle(brush,rect);
   }
  }

  /// <summary>
  /// 绘制当前位置的可行路径
  /// </summary>
  /// <param name="g"></param>
  public void DrawNextPath(Graphics g)
  {
   CCoor c=(CCoor)this.stack.Peek();
   Stack s=c.WayPath;
   IEnumerator myEnumerator=s.GetEnumerator();
   while(myEnumerator.MoveNext())
   {
    Point p=(Point)myEnumerator.Current;
    Point pp=new Point((p.Y*BoxSize.Width)+StartPoint.X,(p.X*BoxSize.Height)+StartPoint.Y);
    SolidBrush brush=new SolidBrush(Color.Yellow);
    Rectangle rect=new Rectangle(pp,BoxSize);
    g.FillRectangle(brush,rect);
   }
  }

  /// <summary>
  /// 判断迷宫是否走完
  /// </summary>
  /// <returns></returns>
  public bool IsEnd()
  {
   CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息
   if( coor.CurrentPoint.X==this.out_p.X && coor.CurrentPoint.Y==this.out_p.Y )
    return true;
   else
    return false;
  }

  /// <summary>
  /// 走一迷宫中的一个格子
  /// </summary>
  /// <returns>数字状态</returns>
  public int Step()
  {
   CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息
   //是否到达出口
   if(!(coor.CurrentPoint.X==this.out_p.X&&coor.CurrentPoint.Y==this.out_p.Y))
   {
    Stack ss=coor.WayPath;
    if(ss.Count==0)
    {
     this.stack.Pop();
     return 0;
    }
    Point p=(Point)ss.Pop(); //当前位置可继续移动的下一个位置
    if(p.X==this.out_p.X&&p.Y==this.out_p.Y)
    {
     this.stack.Push(new CCoor(p,new Stack()));
     return 0;
    }
    Stack st=this.Test(p,coor.CurrentPoint); //得到下一个可移动位置的所有可移动位置
    if(st.Count==0)
    {
     return 0;
    }
    CCoor newcoor=new CCoor(p,st); //建立新的位置信息
    this.stack.Push(newcoor); //压入堆栈
    this.step_count++; //所走步骤加1
    return 0;
   }
   else
    return 1;
  }

  /// <summary>
  /// 走迷宫
  /// </summary>
  public void Run()
  {
   while(this.Step()!=1);
  }

  /// <summary>
  /// 回复到迷宫起点
  /// </summary>
  public void Reset()
  {
   this.stack.Clear();
   Stack way=this.Test(this.in_p,this.in_p);
   stack.Push(new CCoor(this.in_p,way));
   this.step_count=1;
  }

  /// <summary>
  /// 探测可行路线
  /// 探测顺序 右->前->左->后
  ///       左
  ///       |
  ///   后--+-->前
  ///       |
  ///       右
  /// </summary>
  /// <param name="p">从当前点查询四周是否有可行路线</param>
  /// <param name="perv_p">先前的路线</param>
  /// <returns>可行路线堆栈</returns>
  public Stack Test(Point p,Point perv_p)
  {
   Stack stack_way=new Stack(); //该点可行位置堆栈
   int x,y;

   //后
   x=p.X;
   y=p.Y-1;
   this.Signpost(x,y,stack_way,perv_p);

   //左
   x=p.X-1;
   y=p.Y;
   this.Signpost(x,y,stack_way,perv_p);

   //前
   x=p.X;
   y=p.Y+1;
   this.Signpost(x,y,stack_way,perv_p);

   //右
   x=p.X+1;
   y=p.Y;
   this.Signpost(x,y,stack_way,perv_p);

   return stack_way;
  }

  /// <summary>
  /// 判断该方向是否可行,可行则将信息压入堆栈,只在Test()函数中调用
  /// </summary>
  /// <param name="x">x坐标</param>
  /// <param name="y">y坐标</param>
  /// <param name="s">堆栈</param>
  /// <param name="perv_p">来时候的方向</param>
  private void Signpost(int x,int y,Stack s,Point perv_p)
  {
   if(  (x>=0 && x<this.mg.GetLength(0)) && (y>=0 && y<this.mg.GetLength(1)) )
   {
    if(this.mg[x,y]&&!(x==perv_p.X&&y==perv_p.Y))
     s.Push(new Point(x,y));
   }
  }

  /// <summary>
  /// 迷宫简图
  /// </summary>
  /// <returns>字符地图</returns>
  public override string ToString()
  {
   string str="";
   for(int i=0;i<mg.GetLength(0);i++)
   {
    for(int j=0;j<mg.GetLength(1);j++)
    {
     if(this.mg[i,j])
      str+="□";
     else
      str+="■";
    }
    str+="/n";
   }
   return str;
  }
 }

 /// <summary>
 /// 当前坐标信息,和可走方向坐标
 /// </summary>
 public class CCoor
 {
  private Point curr_p; //当前坐标
  private Stack way;  //可走方向坐标

  public CCoor()
  {
   //...
  }

  public CCoor(Point p,Stack w)
  {
   curr_p=p;
   way=w;
  }

  public Point CurrentPoint
  {
   get{return this.curr_p;}
   set{this.curr_p=value;}
  }

  public Stack WayPath
  {
   set{this.way=value;}
   get{return this.way;}
  }
 }
}

走迷宫C#版(一)

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 04:24
  • 166

java实现走迷宫算法

代码实现了 读取文件中迷宫地图,打印迷宫地图并找到一条出口。第一次写java代码,留着纪念。 package com.maze.path; import java.util.Stack; impor...
  • Active7
  • Active7
  • 2015年11月27日 11:47
  • 1108

纯 js 迷宫

/*一共2个文件  js 文件和 html 文件 ,ie下浏览正常*采用最短路径法编写*附效果图*//**  把js文件保存为 migong.js*//** migong.js*/ /** * @au...
  • fieldyang
  • fieldyang
  • 2009年09月03日 15:10
  • 2063

【c++】利用循环和栈实现走迷宫

要求: 1、将地图的数组保存在文件中,从文件中读取行列数 2.、动态开辟空间保存地图 3.、运行结束后再地图上标出具体的走法 说明: 1、文件中第一行分别放置的是地图的行数和...
  • a1414345
  • a1414345
  • 2016年12月24日 17:42
  • 897

递归算法求老鼠走迷宫(C语言)

/*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。 解法老鼠的走法有上、左、下、右四个方向,在每前进一格之后...
  • zhangchao3322218
  • zhangchao3322218
  • 2011年09月29日 17:32
  • 6177

从算法学起C语言--老鼠走迷宫

转载请注明出处,谢谢~ 背景说明: 老鼠走迷宫是递回求解的基本问题,我们在二维阵列中用2表示迷宫墙壁,使用1来表示老鼠走过的路径,求出由入口到出口的路径。 大天朝白话文: 有迷宫挡在了你和妹子...
  • u011200844
  • u011200844
  • 2015年01月28日 15:37
  • 2979

一道走迷宫算法题python实现

前几天逛博客时看到了这样一道问题,感觉比较有趣,就自己思考了下方案顺便用python实现了一下。题目如下: 用一个二维数组表示一个简单的迷宫,用0表示通路,用1表示阻断,老鼠在每个点上可以移动相邻的东...
  • sinly100
  • sinly100
  • 2017年06月01日 16:47
  • 942

老鼠走迷宫程序实例

/*--------------------------------------------------------------------------------------------//文件名称...
  • w9521423
  • w9521423
  • 2005年10月03日 20:47
  • 2360

走迷宫C#版(二)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 08:55
  • 122

Java与算法之(5) - 老鼠走迷宫(深度优先算法)

小老鼠走进了格子迷宫,如何能绕过猫以最短的路径迟到奶酪呢? 注意只能上下左右移动,不能斜着移动。 在解决迷宫问题上,深度优先的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径。 首先用一...
  • autfish
  • autfish
  • 2016年09月06日 13:47
  • 9806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:走迷宫C#版(一)
举报原因:
原因补充:

(最多只允许输入30个字)