6. 具容錯的門檻設定之圖形標型(Pattern)搜尋

題目要認真看,他的xy2只是另一點的座標@@

string[] parsePattern(string text)
{
    var k = text.Split("\r\n")
        .ToList()
        .FindAll(r => r.Length > 0)
        .Select(r => r.Split(" ").Select(r => Convert.ToInt16(r, 16)).ToList()).ToList();
    var w = k[0][0];
    var h = k[0][1];
    string[] data = new string[k.Count - 1];
    for (int i = 1; i < k.Count; i++)
    {
        data[i - 1] = string.Concat(k[i].Select(r => Convert.ToString(r, 2).PadLeft(8, '0')));
    }
    return data;
}

Console.Write("Enter org filename:");
var torg = File.ReadAllText(Console.ReadLine());
Console.Write("Enter pattern filename:");
var tpattern = File.ReadAllText(Console.ReadLine());
Console.Write("Enter Number of faults:");
var faults = int.Parse(Console.ReadLine());

var org = parsePattern(torg);
var pattern = parsePattern(tpattern);

bool find(int x, int y)
{
    int f = 0;
    for (int xx = 0; xx < pattern[0].Length; xx++)
        for (int yy = 0; yy < pattern.Length; yy++)
        {
            if (org[y + yy][x + xx] != pattern[yy][xx])
            {
                f++;
                if (f > faults) return false;
            }
        }
    return true;
}

Console.WriteLine();
bool any = false;
for (int x = 0; x < org[0].Length - pattern[0].Length; x++)
{
    for (int y = 0; y < org.Length - pattern.Length; y++)
    {
        if (find(x, y))
        {
            Console.WriteLine($"x1: {x}, y1: {y},  x2: {x + pattern[0].Length}, y2: {y+pattern.Length}");
            any = true;
            break;
        }
    }
}


if (!any)
{
    Console.WriteLine("No match.");
}

Last updated