using System;
using System.Collections.Generic;
using System.Linq;
struct Queen
{
public int X;
public int Y;
public Queen(int x, int y)
{
this.X = x;
this.Y = y;
}
public bool IsMovable(Queen q)
{
return (this.X == q.X) || (this.Y == q.Y) || this.IsDiagonal(q);
}
public bool IsDiagonal(Queen q)
{
var diffX = this.X - q.X;
var diffY = this.Y - q.Y;
return (diffX == diffY || diffX == -diffY);
}
}
class Program
{
static void Main()
{
var letters = new string[]
{
"lhikoav",
"rqsczlp",
"uwalnfo",
"tykajeh",
"ahitsyd",
"efoptxn",
"ruzwyve"
};
var result =
from q1 in Enumerable.Range(1, 7).Select(x => new Queen(x, 1))
from q2 in Enumerable.Range(1, 7).Select(x => new Queen(x, 2))
from q3 in new Queen[] {new Queen(3, 3)}
from q4 in Enumerable.Range(1, 7).Select(x => new Queen(x, 4))
from q5 in new Queen[] {new Queen(4, 5)}
from q6 in Enumerable.Range(1, 7).Select(x => new Queen(x, 6))
from q7 in Enumerable.Range(1, 7).Select(x => new Queen(x, 7))
let queens = new Queen[] {q1, q2, q3, q4, q5, q6, q7}
where Combinations(queens).All(t => !t[0].IsMovable(t[1]))
select new string((from q in queens
orderby q.X * q.Y
select letters[q.Y - 1][q.X - 1])
.ToArray());
foreach (var s in result)
Console.WriteLine(s);
}
static IEnumerable<T[]> Combinations<T>(IEnumerable<T> source)
{
var list = new List<T>(source);
for (var i = 0; i < list.Count; i++)
for (var j = i + 1; j < list.Count; j++)
yield return new T[] {list[i], list[j]};
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpzdHJ1Y3QgUXVlZW4KewogIHB1YmxpYyBpbnQgWDsKICBwdWJsaWMgaW50IFk7CiAgcHVibGljIFF1ZWVuKGludCB4LCBpbnQgeSkKICB7CiAgICB0aGlzLlggPSB4OwogICAgdGhpcy5ZID0geTsKICB9CiAgcHVibGljIGJvb2wgSXNNb3ZhYmxlKFF1ZWVuIHEpCiAgewogICAgcmV0dXJuICh0aGlzLlggPT0gcS5YKSB8fCAodGhpcy5ZID09IHEuWSkgfHwgdGhpcy5Jc0RpYWdvbmFsKHEpOwogIH0KICBwdWJsaWMgYm9vbCBJc0RpYWdvbmFsKFF1ZWVuIHEpCiAgewogICAgdmFyIGRpZmZYID0gdGhpcy5YIC0gcS5YOwogICAgdmFyIGRpZmZZID0gdGhpcy5ZIC0gcS5ZOwogICAgcmV0dXJuIChkaWZmWCA9PSBkaWZmWSB8fCBkaWZmWCA9PSAtZGlmZlkpOwogIH0KfQoKY2xhc3MgUHJvZ3JhbQp7CiAgc3RhdGljIHZvaWQgTWFpbigpCiAgewogICAgdmFyIGxldHRlcnMgPSBuZXcgc3RyaW5nW10KICAgIHsKICAgICAgImxoaWtvYXYiLAogICAgICAicnFzY3pscCIsCiAgICAgICJ1d2FsbmZvIiwKICAgICAgInR5a2FqZWgiLAogICAgICAiYWhpdHN5ZCIsCiAgICAgICJlZm9wdHhuIiwKICAgICAgInJ1end5dmUiCiAgICB9OwogICAgdmFyIHJlc3VsdCA9CiAgICAgIGZyb20gcTEgaW4gRW51bWVyYWJsZS5SYW5nZSgxLCA3KS5TZWxlY3QoeCA9PiBuZXcgUXVlZW4oeCwgMSkpCiAgICAgIGZyb20gcTIgaW4gRW51bWVyYWJsZS5SYW5nZSgxLCA3KS5TZWxlY3QoeCA9PiBuZXcgUXVlZW4oeCwgMikpCiAgICAgIGZyb20gcTMgaW4gbmV3IFF1ZWVuW10ge25ldyBRdWVlbigzLCAzKX0KICAgICAgZnJvbSBxNCBpbiBFbnVtZXJhYmxlLlJhbmdlKDEsIDcpLlNlbGVjdCh4ID0+IG5ldyBRdWVlbih4LCA0KSkKICAgICAgZnJvbSBxNSBpbiBuZXcgUXVlZW5bXSB7bmV3IFF1ZWVuKDQsIDUpfQogICAgICBmcm9tIHE2IGluIEVudW1lcmFibGUuUmFuZ2UoMSwgNykuU2VsZWN0KHggPT4gbmV3IFF1ZWVuKHgsIDYpKQogICAgICBmcm9tIHE3IGluIEVudW1lcmFibGUuUmFuZ2UoMSwgNykuU2VsZWN0KHggPT4gbmV3IFF1ZWVuKHgsIDcpKQogICAgICBsZXQgcXVlZW5zID0gbmV3IFF1ZWVuW10ge3ExLCBxMiwgcTMsIHE0LCBxNSwgcTYsIHE3fQogICAgICB3aGVyZSBDb21iaW5hdGlvbnMocXVlZW5zKS5BbGwodCA9PiAhdFswXS5Jc01vdmFibGUodFsxXSkpCiAgICAgIHNlbGVjdCBuZXcgc3RyaW5nKChmcm9tIHEgaW4gcXVlZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmJ5IHEuWCAqIHEuWQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGxldHRlcnNbcS5ZIC0gMV1bcS5YIC0gMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0FycmF5KCkpOwogICAgZm9yZWFjaCAodmFyIHMgaW4gcmVzdWx0KQogICAgICBDb25zb2xlLldyaXRlTGluZShzKTsKICB9CgogIHN0YXRpYyBJRW51bWVyYWJsZTxUW10+IENvbWJpbmF0aW9uczxUPihJRW51bWVyYWJsZTxUPiBzb3VyY2UpCiAgewogICAgdmFyIGxpc3QgPSBuZXcgTGlzdDxUPihzb3VyY2UpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCiAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGxpc3QuQ291bnQ7IGorKykKICAgICAgICB5aWVsZCByZXR1cm4gbmV3IFRbXSB7bGlzdFtpXSwgbGlzdFtqXX07CiAgfQp9