Skip to content

Commit a6bc8da

Browse files
committed
Passed the board state into the solver methods so we can try to use it for shape-based solver methods.
1 parent f2172c1 commit a6bc8da

20 files changed

+43
-16
lines changed

FinModelUtility/Fin/Fin.Picross/src/PicrossSolver.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
using fin.data;
2-
using fin.data.indexable;
3-
using fin.math;
1+
using fin.math;
42
using fin.picross.moves;
53
using fin.picross.solver.methods;
64
using fin.picross.solver.methods.easy;
75
using fin.picross.solver.methods.hard;
8-
using fin.util.asserts;
96

107
namespace fin.picross.solver;
118

129
public class PicrossSolver {
1310
public IReadOnlyList<IReadOnlySet<IPicrossMove>> Solve(
1411
IPicrossDefinition picrossDefinition,
15-
out PicrossBoardState finalBoardState) {
12+
out IPicrossBoardState finalBoardState) {
1613
var boardState = new PicrossBoardState(picrossDefinition);
1714

1815
var width = picrossDefinition.Width;
@@ -34,6 +31,7 @@ public IReadOnlyList<IReadOnlySet<IPicrossMove>> Solve(
3431
for (var x = 0; x < width; ++x) {
3532
foreach (var picrossMove1d in CheckClues_(
3633
isFirstPass,
34+
boardState,
3735
columnLineStates[x],
3836
yClueIndicesForward,
3937
yClueIndicesBackward)) {
@@ -54,6 +52,7 @@ public IReadOnlyList<IReadOnlySet<IPicrossMove>> Solve(
5452
for (var y = 0; y < height; ++y) {
5553
foreach (var picrossMove1d in CheckClues_(
5654
isFirstPass,
55+
boardState,
5756
rowLineStates[y],
5857
xClueIndicesForward,
5958
xClueIndicesBackward)) {
@@ -120,6 +119,7 @@ private static readonly IReadOnlyList<IPicrossSolverMethod> SOLVER_METHODS_
120119

121120
private static IEnumerable<IPicrossMove1d> CheckClues_(
122121
bool isFirstPass,
122+
IPicrossBoardState boardState,
123123
IPicrossLineState lineState,
124124
int[] clueIndicesForward,
125125
int[] clueIndicesBackward) {
@@ -217,7 +217,9 @@ var backwardMoves1d
217217

218218
foreach (var solverMethod in SOLVER_METHODS_) {
219219
var hadAnyOfMethod = false;
220-
foreach (var move in solverMethod.TryToFindMoves(lineState)) {
220+
foreach (var move in solverMethod.TryToFindMoves(
221+
boardState,
222+
lineState)) {
221223
hadAnyOfMethod = true;
222224
yield return move;
223225
}

FinModelUtility/Fin/Fin.Picross/src/solver/PicrossBoardState.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ public class PicrossCellState : IPicrossCellState {
3737
public interface IPicrossBoardState : IReadOnlyGrid<IReadOnlyPicrossCellState> {
3838
IReadOnlyList<IPicrossLineState> ColumnLineStates { get; }
3939
IReadOnlyList<IPicrossLineState> RowLineStates { get; }
40+
41+
PicrossCompletionState GetCompletionState();
4042
}
4143

42-
public class PicrossBoardState : IReadOnlyGrid<IReadOnlyPicrossCellState> {
44+
public class PicrossBoardState : IPicrossBoardState {
4345
private readonly IPicrossDefinition definition_;
4446
private readonly IReadOnlyList<IPicrossCellState> cellStates_;
4547

@@ -102,6 +104,7 @@ private static IReadOnlyList<IReadOnlyList<IPicrossClueState>> ToClueStates_(
102104

103105
public IReadOnlyList<IPicrossLineState> ColumnLineStates
104106
=> this.columnLineStates_;
107+
105108
public IReadOnlyList<IPicrossLineState> RowLineStates => this.rowLineStates_;
106109

107110
public void ApplyMoves(IReadOnlySet<IPicrossMove> moveSet) {

FinModelUtility/Fin/Fin.Picross/src/solver/methods/BBidirectionalSolverMethod.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods;
44

55
public abstract class BBidirectionalSolverMethod : IPicrossSolverMethod {
66
public abstract IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState boardState,
78
IPicrossLineState lineState,
89
int iStart,
910
int iEnd,
@@ -12,19 +13,22 @@ public abstract IEnumerable<IPicrossMove1d> TryToFindMoves(
1213
int increment);
1314

1415
public IEnumerable<IPicrossMove1d> TryToFindMoves(
16+
IPicrossBoardState boardState,
1517
IPicrossLineState lineState) {
1618
var clues = lineState.ClueStates;
1719
var cellStates = lineState.CellStates;
1820

1921
var forwardMoves
20-
= this.TryToFindMoves(lineState,
22+
= this.TryToFindMoves(boardState,
23+
lineState,
2124
0,
2225
cellStates.Count,
2326
0,
2427
clues.Count,
2528
1);
2629
var backwardMoves
27-
= this.TryToFindMoves(lineState,
30+
= this.TryToFindMoves(boardState,
31+
lineState,
2832
cellStates.Count - 1,
2933
-1,
3034
clues.Count - 1,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/BigThenSinglesSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55

66
public class BigThenSinglesSolverMethod : BBidirectionalSolverMethod {
77
public override IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState,
910
int iStart,
1011
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/ExpandFinalUnsolvedClueSolverMethod.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
namespace fin.picross.solver.methods;
55

66
public class ExpandFinalUnsolvedClueSolverMethod : IPicrossSolverMethod {
7-
public IEnumerable<IPicrossMove1d>
8-
TryToFindMoves(IPicrossLineState lineState) {
7+
public IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
9+
IPicrossLineState lineState) {
910
// Make sure we only run this solver if there's a single unsolved clue
1011
var clueStates = lineState.ClueStates;
1112
var lastUnsolvedClue

FinModelUtility/Fin/Fin.Picross/src/solver/methods/ExpandFirstClueWhenPerfectFitSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55
public class ExpandFirstClueWhenPerfectFitSolverMethod
66
: BBidirectionalSolverMethod {
77
public override IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState,
910
int iStart,
1011
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/ExpandTwoSeparatedCluesSolverMethod.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
namespace fin.picross.solver.methods;
44

55
public class ExpandTwoSeparatedCluesSolverMethod : IPicrossSolverMethod {
6-
public IEnumerable<IPicrossMove1d>
7-
TryToFindMoves(IPicrossLineState lineState) {
6+
public IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
8+
IPicrossLineState lineState) {
89
var clueStates = lineState.ClueStates;
910
if (clueStates is not [
1011
{ Solved: false } firstClue,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/ExtendFirstClueSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods;
44

55
public class ExtendFirstClueSolverMethod : BBidirectionalSolverMethod {
66
public override IEnumerable<PicrossCellMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState,
89
int iStart,
910
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/FillSmallestUnknownsBetweenEmptiesSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55
public class FillSmallestUnknownsBetweenEmptiesSolverMethod
66
: IPicrossSolverMethod {
77
public IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState) {
910
var clues = lineState.ClueStates;
1011
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/GapsAroundFirstClueSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods;
44

55
public class GapsAroundFirstClueSolverMethod : BBidirectionalSolverMethod {
66
public override IEnumerable<PicrossCellMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState,
89
int iStart,
910
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/GapsBetweenKnownCluesSolverMethod.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
namespace fin.picross.solver.methods;
44

55
public class GapsBetweenKnownCluesSolverMethod : IPicrossSolverMethod {
6-
public IEnumerable<IPicrossMove1d>
7-
TryToFindMoves(IPicrossLineState lineState) {
6+
public IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
8+
IPicrossLineState lineState) {
89
var clueStates = lineState.ClueStates;
910
var cellStates = lineState.CellStates;
1011
var length = cellStates.Count;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/GapsBetweenNeighboringCluesSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods;
44

55
public class GapsBetweenNeighboringCluesSolverMethod : IPicrossSolverMethod {
66
public IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState) {
89
var clues = lineState.ClueStates;
910
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/GapsBetweenNeighboringShortCluesSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55
public class GapsBetweenNeighboringShortCluesSolverMethod
66
: IPicrossSolverMethod {
77
public IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState) {
910
var clues = lineState.ClueStates;
1011
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/Interfaces.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
namespace fin.picross.solver.methods;
44

55
public interface IPicrossSolverMethod {
6-
IEnumerable<IPicrossMove1d> TryToFindMoves(IPicrossLineState lineState);
6+
IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState boardState,
8+
IPicrossLineState lineState);
79
}

FinModelUtility/Fin/Fin.Picross/src/solver/methods/MatchingBiggestOrUniqueLengthSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55

66
public class MatchingBiggestOrUniqueLengthSolverMethod : IPicrossSolverMethod {
77
public IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState) {
910
var clueStates = lineState.ClueStates;
1011
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/OnlyClueLengthInReachSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace fin.picross.solver.methods;
55

66
public class OnlyClueLengthInReachSolverMethod : BBidirectionalSolverMethod {
77
public override IEnumerable<IPicrossMove1d> TryToFindMoves(
8+
IPicrossBoardState _,
89
IPicrossLineState lineState,
910
int iStart,
1011
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/easy/AlreadySolvedPicrossSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods.easy;
44

55
public class AlreadySolvedPicrossSolverMethod : IPicrossSolverMethod {
66
public IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState) {
89
var clueStates = lineState.ClueStates;
910
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/easy/AlreadySolvedUpToPicrossSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods.easy;
44

55
public class AlreadySolvedUpToPicrossSolverMethod : BBidirectionalSolverMethod {
66
public override IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState,
89
int iStart,
910
int iEnd,

FinModelUtility/Fin/Fin.Picross/src/solver/methods/easy/GapsAroundKnownCluesSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods.easy;
44

55
public class GapsAroundKnownCluesSolverMethod : IPicrossSolverMethod {
66
public IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState) {
89
var clueStates = lineState.ClueStates;
910
var cellStates = lineState.CellStates;

FinModelUtility/Fin/Fin.Picross/src/solver/methods/hard/SingleNextToEdgeSolverMethod.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace fin.picross.solver.methods.hard;
44

55
public class SingleNextToEdgeSolverMethod : BBidirectionalSolverMethod {
66
public override IEnumerable<IPicrossMove1d> TryToFindMoves(
7+
IPicrossBoardState _,
78
IPicrossLineState lineState,
89
int iStart,
910
int iEnd,

0 commit comments

Comments
 (0)