using System.Collections.Generic; using System.Linq; namespace nqueens { public class NBoard { public readonly int[] Columns; public int Size { get { return Columns.Length; } } public readonly int[] Conflicts; public NBoard(int[] columns) { Columns = columns; Conflicts = (from n in Enumerable.Range(0, Size) select GetConflictCount(n)).ToArray(); } public int GetQueenRow(int column) { return Columns[column]; } public bool IsFeasible() { return Conflicts.All(c => c == 0); } public int GetConflictCount(int column) { return GetConflicts(column).Count; } public int TestConflictCount(int column, int row) { var originalRow = Columns[column]; Columns[column] = row; var conflicts = GetConflictCount(column); Columns[column] = originalRow; return conflicts; } private List GetConflicts(int column) { var queenRow = GetQueenRow(column); var conflicts = new List(); for (var iColumn = 0; iColumn < Size; iColumn++) { if (iColumn == column) continue; var iRow = Columns[iColumn]; if (iRow == queenRow) { conflicts.Add(iColumn); continue; } var columnDiff = column - iColumn; if (queenRow - columnDiff == iRow || queenRow + columnDiff == iRow) conflicts.Add(iColumn); } return conflicts; } public void UpdateRow(int column, int row) { var oldConflictColumns = GetConflicts(column); foreach (var i in oldConflictColumns) Conflicts[i]--; var sum = Conflicts.Any(c => c < 0); Columns[column] = row; var newConflictColumns = GetConflicts(column); Conflicts[column] = newConflictColumns.Count; foreach (var i in newConflictColumns) Conflicts[i]++; } } }