链接: https://pan.baidu.com/s/1o0vrefFJxRnkWEidexVPtg
提取码: c5hr
余额有限,采纳后会追加5块红包,感谢
链接: 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 );
}
}
}