HJ43 迷宫问题
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 + ")");
}
}
}