ユニに戻って数学の授業にもっと注意を払うことを望みました。:)
ネイキッドトリプルにこの数式を実装するにはどうすればよいですか?
ネイキッドトリプル
ユニットUを共有する3つのセルC={c1、c2、c3}を取ります。3つの数値N = {n1、n2、n3}を取ります。Cの各セルが候補としてci⊆Nを持っている場合、Uの他のセルからすべてのni∈Nを削除できます。**
ユニット(ボックス、行、列など)をパラメーターとして受け取るメソッドがあります。ユニットには9個のセルが含まれているため、一度に3個のセルのすべての組み合わせを比較する必要があります。ボックスから、さらに計算するためにそれらをスタックまたはコレクションに入れます。
次のステップは、これらの3つのセルの組み合わせを1つずつ取得し、それらの候補を3つの数値と比較することです。繰り返しますが、これらの3つの数字は、1から9までの任意の組み合わせにすることができます。必要なのはそれだけです。
しかし、どうすればよいでしょうか。いくつの組み合わせが得られますか?セルに対して3x9 = 27の組み合わせを取得し、次に数値(N)に対して同じ組み合わせを取得しますか?
従来のC#ループでこれをどのように解決しますか?ラムダ式はありません。私はすでに十分に混乱しています:)
コード: ここでクラスを表すために、クラスを短くする必要がありました。
public class Cell : INotifyPropertyChanged
{
public ObservableCollection<ObservableCollection<Candidate>> CandidateActual {...}
public int Id { ... }
//Position of the Cell inside a box if applicable
public int CellBoxPositionX { get; private set; }
public int CellBoxPositionY { get; private set; }
//Position of the Cell inside the game board
public int CellBoardPositionX { get; private set; }
public int CellBoardPositionY { get; private set; }
//Position of the Box inside the game board
public int BoxPositionX { get; private set; }
public int BoxPositionY { get; private set; }
public int CountCandidates { ... }
public int? Value { ...}
public Candidate this[int number]
{
get
{
if (number < 1 || number > PossibleValues.Count)
{
throw new ArgumentOutOfRangeException("number", number, "Invalid Number Index");
}
switch (number)
{
case 1:
return CandidateActual[0][0];
case 2:
return CandidateActual[0][1];
case 3:
return CandidateActual[0][2];
case 4:
return CandidateActual[1][0];
case 5:
return CandidateActual[1][1];
case 6:
return CandidateActual[1][2];
case 7:
return CandidateActual[2][0];
case 8:
return CandidateActual[2][1];
case 9:
return CandidateActual[2][2];
default:
return null;
}
}
}
}
候補者
public class Candidate : INotifyPropertyChanged
{
private int? _value;
public int? Value { ... }
}
箱:
public class Box : INotifyPropertyChanged
{
public ObservableCollection<ObservableCollection<Cell>> BoxActual { ... }
public Cell this[int row, int column]
{
get
{
if(row < 0 || row >= BoxActual.Count)
{
throw new ArgumentOutOfRangeException("row", row, "Invalid Row Index");
}
if(column < 0 || column >= BoxActual.Count)
{
throw new ArgumentOutOfRangeException("column", column, "Invalid Column Index");
}
return BoxActual[row][column];
}
}
}
ボード
public class Board : INotifyPropertyChanged
{
public ObservableCollection<ObservableCollection<Box>> GameBoard {...}
public Cell this[int boardRowPosition, int boardColumnPosition]
{
get
{
int totalSize = GameBoard.Count*GameBoard.Count();
if (boardRowPosition < 0 || boardRowPosition >= totalSize)
throw new ArgumentOutOfRangeException("boardRowPosition", boardRowPosition, "Invalid boardRowPosition index");
if (boardColumnPosition < 0 || boardColumnPosition >= totalSize)
throw new ArgumentOutOfRangeException("boardColumnPosition", boardColumnPosition, "Invalid boardColumnPosition index");
return
GameBoard[boardRowPosition/GameBoard.Count][boardColumnPosition/GameBoard.Count][
boardRowPosition%GameBoard.Count, boardColumnPosition%GameBoard.Count];
}
}
public Box this[int boardRowPosition, int boardColumnPosition, bool b]
{
get
{
int totalSize = GameBoard.Count * GameBoard.Count();
if (boardRowPosition < 0 || boardRowPosition >= totalSize)
throw new ArgumentOutOfRangeException("boardRowPosition", boardRowPosition, "Invalid boardRowPosition index");
if (boardColumnPosition < 0 || boardColumnPosition >= totalSize)
throw new ArgumentOutOfRangeException("boardColumnPosition", boardColumnPosition, "Invalid boardColumnPosition index");
return
GameBoard[boardRowPosition / GameBoard.Count][boardColumnPosition / GameBoard.Count];
}
}
}
助けてくれてありがとう、