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 + ")");
        }
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值