Соединить числа в квадрате "змейкой" - C#
Формулировка задачи:
На конверт нужно клеить марку.
Место приклеивание нужно заштриховать "змейкой", как показано в примере.
Требуется вывести квадрат с числами, в каком порядке следует соединять точки квадрата.
Сначала вправо, потом влево-вниз по диагонали, вниз, вправо-вверх по диагонали и так далее, по схеме.
Последней будет точка в правом нижнем углу.
Вывести квадрат, состоящий из NxN ячеек, заполненный числами от 1 до N2 "змейкой".
Начальные данные: Целое число N <= 317
Вывод результата: Квадрат со значениями согласно условию.
Количество знакомест, отводимых для отображения чисел,
определяется количеством разрядов максимального числа в квадрате.
Значения выводятся с выравниванием чисел в столбце по правому краю.
Между столбцами - один пробел. После последнего числа в строке пробел не ставится.
Решение задачи: «Соединить числа в квадрате "змейкой"»
textual
Листинг программы
class Generator : IEnumerable<Tuple<int, int, int>>
{
int size, row, col;
Action next;
public Generator(int n)
{
this.size = n;
}
public IEnumerator<Tuple<int, int, int>> GetEnumerator()
{
next = Init;
foreach (int x in Enumerable.Range(1, size * size))
{
next();
yield return Tuple.Create(row, col, x);
}
}
private void Init()
{
row = col = 0;
next = Right;
}
void Right()
{
col++;
if (row == 0) next = DownLeft;
else next = UpRight;
}
void Down()
{
row++;
if (col < size - 1) next = UpRight;
else next = DownLeft;
}
void DownLeft()
{
row++; col--;
if (row == size - 1) next = Right;
else if (col == 0) next = Down;
}
void UpRight()
{
row--; col++;
if (col == size - 1) next = Down;
else if (row == 0) next = Right;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}