前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
次はここを処理します。
ここは縦の数字がすでに3が塗られているので、上の空いているマスに1マス、下の空いているマスに2マスを塗ることができます。
なので、赤く囲んだ部分は塗れると言うことですね。
これを実装します。
考え方としては、まだ確定していないマスと数字を抽出し、順序関係が一致かつ、数字とマスが一致した場合、そこを塗る、という感じでいきますか。
// 解析パターンその14
// 数字と空いているマスを照合して塗る
private void pattern14()
{
// Row
pattern14Row();
// Col
pattern14Col();
}
private void pattern14Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
// 有効な数字を取り出す
List<AnalyzeData> aData = new List<AnalyzeData>();
foreach(var data in rowlist.AnalyzeDatas)
{
if (data.IsAnalyzed())
{
continue;
}
aData.Add(data);
}
// 対象となるマスを抽出する
List<List<BitmapData>> bitmapLists = extractTargetBitmapListsCol(row);
bitmapLists.Reverse();
// 数字とマスを照合する
if (bitmapLists.Count != aData.Count)
{
row++;
continue;
}
AnalyzeData maxData = null;
int remi = 0;
for(int i = 0; i < aData.Count; i++)
{
if (maxData == null)
{
maxData = aData[i];
}
else
{
if(maxData.Value < aData[i].Value)
{
remi = i;
}
}
}
if(maxData != null)
{
if (bitmapLists[remi].Count == maxData.Value)
{
foreach (var b in bitmapLists[remi])
{
b.Paint();
}
maxData.Analyzed();
}
}
row++;
}
}
extractTargetBitmapListsCol()の処理も少し修正しています。
実行結果はこうなりました。
ここまで複雑なロジックを組み合わせていくと、過去の問題が解けなくなっているとか十分あり得るので、その確認が大変です。
なんかもっといい確認方法を考えないといけないかもしれない。
何か方法を考えます。