87 lines
1.7 KiB
C#
87 lines
1.7 KiB
C#
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<int> GetConflicts(int column)
|
|
{
|
|
var queenRow = GetQueenRow(column);
|
|
var conflicts = new List<int>();
|
|
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]++;
|
|
}
|
|
}
|
|
} |