BFS

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

namespace BFS
{
    class Program
    {
        private const int MAXX = 100;
        private const int MAXY = 100;

        private static int m_dx = -1;
        private static int m_dy = -1;

        private static Queue<Point> m_Q; 

        static void Main(string[] args)
        {
            int xlength = 4;
            int ylength = 4;
            Point[][] g = new Point[xlength][];
            int[][] map = new int[][]
                {new int[] {0, 0, 0, 0}, new int[] {0, 1, 0, 1}, new int[] {0, 0, 0, 1}, new int[] {1, 2, 1, 1}};

            Inist(g, xlength, ylength);
            BFS(g, new Point() {X = 0, Y = 0}, xlength, ylength, map);
            var end = g[m_dx][m_dy].Distance;
        }
        public static void Inist(Point[][] g,int xlength,int ylenth)
        {
            for (int i = 0; i <xlength; i++)
            {
                g[i] = new Point[ylenth];
            }
            m_Q = new Queue<Point>();
        }
        public static void BFS(Point[][] g, Point s, int xlength, int ylength,int[][] map)
        {
            for (int i = 0; i < xlength; i++)
            {
                for (int j = 0; j < ylength; j++)
                {
                    var type = map[i][j];
                    g[i][j] = new Point() { Color = 0, Distance = int.MaxValue, Parent = null, X = i, Y = j, type = type };
                    if(type==2)
                    {
                        m_dx = i;
                        m_dy = j;
                        g[i][j].type = 0;
                    }
                }
            }
            g[s.X][s.Y].Color = 1;
            g[s.X][s.Y].Distance = 0;
            g[s.X][s.Y].Parent = null;

            m_Q.Enqueue(g[s.X][s.Y]);
            while (m_Q.Count!=0)
            {
                Point u = m_Q.Dequeue();
                var adjList = GenerAdjustList(g, u, xlength,ylength);
                for (int i = 0; i < adjList.Count; i++)
                {
                    var v = adjList[i];
                    if(v.Color==0&&v.type==0)
                    {
                        v.Color = 1;
                        v.Distance = u.Distance + 1;
                        v.Parent = u;
                        m_Q.Enqueue(v);
                    }
                }
                u.Color = 2;
            }
        }

        private static List<Point> GenerAdjustList(Point[][] points, Point point, int xlength, int ylength)
        {
            var list = new List<Point>();
            if(point.X+1<xlength)
            {
                list.Add(points[point.X+1][point.Y]);
            }
            if(point.X-1>0)
            {
                list.Add(points[point.X - 1][point.Y]);
            }
            if (point.Y + 1 < ylength)
            {
                list.Add(points[point.X][point.Y + 1]);
            }
            if (point.Y - 1 > 0)
            {
                list.Add(points[point.X][point.Y - 1]);
            }
            return list;
        }

    }
    public class Point
    {
        public int X;
        public int Y;

        public int Color;

        public int type;

        public int Distance;

        public Point Parent;
    }
}
原文地址:https://www.cnblogs.com/suriyel/p/2930969.html