Files
discrete-optimization-coursera/puzzle/nqueens/NBoard.cs
T
2025-08-03 20:24:38 -07:00

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]++;
}
}
}