https://moonstonelin.wordpress.com/2016/05/27/maze/
有个迷宫游戏,从网上找了一个类似的,大家可以玩一下:http://www.bigfishgames.com/online-games/4038/slide-maze/index.html。注意跟一般迷宫游戏不同的是,小人只有到墙或者boundary才停下来,我们无法控制小人走的步数。
写一个function,输入是这个迷宫,小人的起始位置,和他的目的地。要求输出一个move的序列,使小人能从起点到终点。
以链接里那个游戏的level one为例,输出(’Down’,’Right’,’Down’,’Right’,’Down’,’Left’,’Down’,’Left’,’Up’,’Left’)。
public List<List<Direction>> Maze(int[,] matrix, int startRow, int startColumn, int endRow, int endColumn){ Dictionary<Tuple<int, int>, Tuple<int, int>> Lefts = new Dictionary<Tuple<int, int>, Tuple<int, int>>(); Dictionary<Tuple<int, int>, Tuple<int, int>> Rights = new Dictionary<Tuple<int, int>, Tuple<int, int>>(); Dictionary<Tuple<int, int>, Tuple<int, int>> Ups = new Dictionary<Tuple<int, int>, Tuple<int, int>>(); Dictionary<Tuple<int, int>, Tuple<int, int>> Downs = new Dictionary<Tuple<int, int>, Tuple<int, int>>(); int R = matrix.GetLength(0); int C = matrix.GetLength(1); for (int r = 0; r < R; r++) { // <<-- int stopColumn = 0; for (int c = 0; c < C; c++) { if (matrix[r, c] == 0) { if ((c - 1 >= 0) && (matrix[r, c - 1] == 1)) { stopColumn = c; } Lefts.Add(new Tuple<int, int>(r, c), new Tuple<int, int>(r, stopColumn)); } } // -->> stopColumn = C - 1; for (int c = C-1; c >= 0; c--) { if (matrix[r, c] == 0) { if ((c + 1 < C) && (matrix[r, c + 1] == 1)) { stopColumn = c; } if ((r == endRow) && (c == endColumn)) { stopColumn = c; } Rights.Add(new Tuple<int, int>(r, c), new Tuple<int, int>(r, stopColumn)); } } } for (int c = 0; c < C; c++) { // up int stopRow = 0; for (int r = 0; r < R; r++) { if (matrix[r, c] == 0) { if ((r - 1 >= 0) && (matrix[r - 1, c] == 1)) { stopRow = r; } if ((r == endRow) && (c == endColumn)) { stopRow = r; } Ups.Add(new Tuple<int, int>(r, c), new Tuple<int, int>(stopRow, c)); } } // down stopRow = R - 1; for (int r = R - 1; r >= 0; r--) { if (matrix[r, c] == 0) { if ((r + 1 < C) && (matrix[r + 1, c] == 1)) { stopRow = r; } if ((r == endRow) && (c == endColumn)) { stopRow = r; } Downs.Add(new Tuple<int, int>(r, c), new Tuple<int, int>(stopRow, c)); } } } List<List<Direction>> result = new List<List<Direction>>(); Stack<Direction> stack = new Stack<Direction>(); HashSet<Tuple<int, int>> visited = new HashSet<Tuple<int, int>>(); Helper(startRow, startColumn, endRow, endColumn, visited, Lefts, Rights, Ups, Downs, result, stack); return result;}private void Helper(int startRow, int startColumn, int endRow, int endColumn, HashSet<Tuple<int, int>> visited, Dictionary<Tuple<int, int>, Tuple<int, int>> Lefts, Dictionary<Tuple<int, int>, Tuple<int, int>> Rights, Dictionary<Tuple<int, int>, Tuple<int, int>> Ups, Dictionary<Tuple<int, int>, Tuple<int, int>> Downs, List<List<Direction>> result, Stack<Direction> stack){ Tuple<int, int> t = new Tuple<int, int>(startRow, startColumn); if (visited.Contains(t)) { return; } visited.Add(t); if ((startRow == endRow) && (startColumn == endColumn)) { List<Direction> ds = new List<Direction>(); ds.AddRange(stack); ds.Reverse(); result.Add(ds); return; } Tuple<int, int> key = new Tuple<int, int>(startRow, startColumn); if (Lefts.ContainsKey(key)) { stack.Push(Direction.Left); Helper(Lefts[key].Item1, Lefts[key].Item2, endRow, endColumn, visited, Lefts, Rights, Ups, Downs, result, stack); stack.Pop(); } if (Rights.ContainsKey(key)) { stack.Push(Direction.Right); Helper(Rights[key].Item1, Rights[key].Item2, endRow, endColumn, visited, Lefts, Rights, Ups, Downs, result, stack); stack.Pop(); } if (Ups.ContainsKey(key)) { stack.Push(Direction.Up); Helper(Ups[key].Item1, Ups[key].Item2, endRow, endColumn, visited, Lefts, Rights, Ups, Downs, result, stack); stack.Pop(); } if (Downs.ContainsKey(key)) { stack.Push(Direction.Down); Helper(Downs[key].Item1, Downs[key].Item2, endRow, endColumn, visited, Lefts, Rights, Ups, Downs, result, stack); stack.Pop(); }}