public void A580301() {
var size = 10;
var maxDelta = 1;
var iters = 100000;
var counter = Enumerable.Range(0, size).Select(x => 0).ToList();
var optimize = false;
for (var z = 0; z < iters; z++) {
var g = new int[size][];
for (var i = 0; i < size; i++) {
var f = Math.Max(0, i - maxDelta);
var t = Math.Min(size - 1, i + maxDelta);
g[i] = new int[t - f + 1];
for (var j = f; j <= t; j++) {
g[i][j - f] = j;
}
Shuffle(g[i]);
}
var mt = new int[size];
for (var i = 0; i < size; i++) {
mt[i] = -1;
}
if (optimize) {
var used1 = new bool[size];
for (var i = 0; i < size; i++) {
for (var j = 0; j < g[i].Length; j++) {
if (mt[g[i][j]] == -1) {
mt[g[i][j]] = i;
used1[i] = true;
break;
}
}
}
for (var i = 0; i < size; i++) {
if (used1[i]) continue;
TryKuhn(new bool[size], g, mt, i);
}
} else {
for (var i = 0; i < size; i++) {
TryKuhn(new bool[size], g, mt, i);
}
}
var result = new int[size];
for (var i = 0; i < size; i++)
if (mt[i] != -1) {
result[mt[i]] = i;
}
for (var i = 0; i < size; i++) {
if (result[i] == 4) {
counter[i]++;
}
}
}
Debug.WriteLine(counter.Select(x => $"{100d * x / iters:F1}%").JoinToString(", "));
}
}