c#编程题,进链接看文本,留下代码,最好带下注释,感谢

链接: https://pan.baidu.com/s/1o0vrefFJxRnkWEidexVPtg

提取码: c5hr 

 

 

余额有限,采纳后会追加5块红包,感谢

 

using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
    class PathInfo
    {
        public int step = 0;
        public int[] curPoint;
    }
    class Program
    {
        static void Main()
        {
            int cell = int.Parse(Console.ReadLine());
            int row = int.Parse(Console.ReadLine());
            var s = Console.ReadLine();
            var chrPoints = new Dictionary<char, List<int[]>>();
            for (var i = 0; i < row; i++)
            {
                for (var j = 0; j < cell; j++)
                {
                    var c = s[i * cell + j];

                    if (chrPoints.ContainsKey(c)) chrPoints[c].Add(new int[] { i, j });
                    else chrPoints[c] = new List<int[]>() { new int[] { i, j } };
                }
            }
            var chrs = Regex.Replace(Console.ReadLine(), "[^" + s + "]", "", RegexOptions.Compiled);
            var paths = new List<PathInfo>();
            foreach (var c in chrs)
            {
                var points = chrPoints[c];
                if (paths.Count == 0)
                {//第一个字符
                    foreach (var p in points)
                    {
                        paths.Add(new PathInfo { curPoint = p, step = p[0] + p[1] + 1 });
                    }
                }
                else
                {
                    if (points.Count > 1)
                    {
                      
                        var newpath = new List<PathInfo>();
                        foreach (var p in points)
                        {
                            foreach (var _p in paths)
                            {
                                var step =_p.step+ Math.Abs(_p.curPoint[0] - p[0]) + Math.Abs(_p.curPoint[1] - p[1]) + 1;
                                newpath.Add(new PathInfo { curPoint = p,step=step });
                            }
                        }
                        paths = newpath.GroupBy(i => i.step).OrderBy(i => i.Key).First().ToList();
                    }
                    else
                    {//参考字符一个,和上次的路径直接求长度
                        foreach (var p in paths)
                        {
                            p.step += Math.Abs(p.curPoint[0] - points[0][0]) + Math.Abs(p.curPoint[1] - points[0][1]) + 1;
                            p.curPoint = points[0];
                        }
                    }
                }
               
            }

            Console.Write(paths.OrderBy(i => i.step).First().step );

        }
    }
}

 

输入

输出