52 lines
1.7 KiB
C#
52 lines
1.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
public static class Nonoblock
|
|
{
|
|
public static void Main() {
|
|
Positions(5, 2,1);
|
|
Positions(5);
|
|
Positions(10, 8);
|
|
Positions(15, 2,3,2,3);
|
|
Positions(5, 2,3);
|
|
}
|
|
|
|
public static void Positions(int cells, params int[] blocks) {
|
|
if (cells < 0 || blocks == null || blocks.Any(b => b < 1)) throw new ArgumentOutOfRangeException();
|
|
Console.WriteLine($"{cells} cells with [{string.Join(", ", blocks)}]");
|
|
if (blocks.Sum() + blocks.Length - 1 > cells) {
|
|
Console.WriteLine("No solution");
|
|
return;
|
|
}
|
|
var spaces = new int[blocks.Length + 1];
|
|
int total = -1;
|
|
for (int i = 0; i < blocks.Length; i++) {
|
|
total += blocks[i] + 1;
|
|
spaces[i+1] = total;
|
|
}
|
|
spaces[spaces.Length - 1] = cells - 1;
|
|
var sb = new StringBuilder(string.Join(".", blocks.Select(b => new string('#', b))).PadRight(cells, '.'));
|
|
Iterate(sb, spaces, spaces.Length - 1, 0);
|
|
Console.WriteLine();
|
|
}
|
|
|
|
private static void Iterate(StringBuilder output, int[] spaces, int index, int offset) {
|
|
Console.WriteLine(output.ToString());
|
|
if (index <= 0) return;
|
|
int count = 0;
|
|
while (output[spaces[index] - offset] != '#') {
|
|
count++;
|
|
output.Remove(spaces[index], 1);
|
|
output.Insert(spaces[index-1], '.');
|
|
spaces[index-1]++;
|
|
Iterate(output, spaces, index - 1, 1);
|
|
}
|
|
if (offset == 0) return;
|
|
spaces[index-1] -= count;
|
|
output.Remove(spaces[index-1], count);
|
|
output.Insert(spaces[index] - count, ".", count);
|
|
}
|
|
|
|
}
|