HJ43 迷宫问题
迷宫问题
描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路, 只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。
入口点为[0,0],既第一格是可以走的路。数据范围:2≤n,m≤10 , 输入的内容只包含 0≤val≤1 输入描述:输入两个整数,分别表示二维数组的行数,列数。 再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。 输出描述:左上角到右下角的最短路径,格式如样例所示。 ```
using System;
using System.Collections.Generic;public class Program
{public static void Main(){string str = Console.ReadLine();int m = Convert.ToInt32(str.Split(' ')[0]);int n = Convert.ToInt32(str.Split(' ')[1]);int[,] dp=new int[m,n];for (int i = 0; i < m; i++){string mstr = Console.ReadLine();for (int j = 0; j < n; j++){dp[i, j] = Convert.ToInt32(mstr.Split(' ')[j]);}}Stack<int> stacks = new Stack<int> ();stacks.Push(0);Stack<(int, int)> stack = new Stack<(int, int)>();stack.Push((0, 0));int s = 0;for (int i = 0,j=0; i < m && j < n; ){if (i == m - 1 && j == n - 1){break;}if (j + 1 < n && dp[i,j + 1] == 0 && s< 1 && !stack.Contains((i, j + 1))){stack.Push((i, j + 1));stacks.Push(1);s = 0;j++;continue;}if (i + 1 < m && dp[i+1, j] == 0 && s < 2 && !stack.Contains((i + 1, j))){stack.Push((i + 1, j));stacks.Push(2);s = 0;i++;continue;}if (j > 0 && dp[i, j-1] == 0 && s <3 && !stack.Contains((i, j-1))){stack.Push((i, j - 1));stacks.Push(3);s = 0;j--;continue;}if (i > 0 && dp[i - 1, j] == 0 && s <4 &&!stack.Contains((i -1,j))){stack.Push((i - 1, j));stacks.Push(4);s = 0;i--;continue;}stack.Pop();var sit = stack.Peek();i = sit.Item1;j = sit.Item2;s = stacks.Pop();}Stack<(int, int)> stackseq = new Stack<(int, int)>();foreach (var item in stack){stackseq.Push(item);}foreach (var item in stackseq){Console.WriteLine("(" + item.Item1 + "," + item.Item2 + ")");}}
}