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