initial commit
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
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]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user