前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
次はこちらの問題を解いてみます。
解析実行。
この状態で止まってしまいましたね。
また新しい解析パターンを追加する必要があるようです。
ここに注目してみました。
この列では4が一番大きい数字で、すでに4マス塗られていますので、この4はすでに確定します。
なので、この4は解析済みにし、両端をマスクする、というロジックが必要です。
これを実装します。
考え方は、
- 行、列から連続する塗られたマスを取得する
- その中から最大の物を取得する
- 数字の中で一番大きい物を取得する
- 取得した連続するマスの数が、一番多き数字と一致するかどうかを確認する
- 一致するならば、その数字を解析済みにし、塗られた連続するマスの両端をマスクする
コードはこうなりました。
// 解析パターンその11
// すでに塗っている場所を解析済みにする
private void pattern11()
{
// Row
pattern11Row();
// Col
pattern11Col();
}
private void pattern11Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
rowlist.AnalyzeDatas.Reverse();
// 塗られている連続したマスを数える
List<List<BitmapData>> data = new List<List<BitmapData>>();
{
List<BitmapData> dataList = new List<BitmapData>();
for (int col = 0; col < colNumbers.Count; col++)
{
if (_bitmapData[row, col].IsPainted() == true)
{
dataList.Add(_bitmapData[row, col]);
}
else
{
if (dataList.Count != 0)
{
data.Add(dataList);
dataList = new List<BitmapData>();
}
}
}
if (dataList.Count != 0)
{
data.Add(dataList);
}
if (data.Count == 0)
{
row++;
rowlist.AnalyzeDatas.Reverse();
continue;
}
}
List<BitmapData> targetDataList = null;
// 最大の物を取得する
foreach (var datalist in data)
{
if(targetDataList == null)
{
targetDataList = datalist;
}
else if(targetDataList.Count < datalist.Count)
{
targetDataList = datalist;
}
}
AnalyzeData targetRowList = null;
foreach(var rowdata in rowlist.AnalyzeDatas)
{
if(targetRowList == null)
{
targetRowList = rowdata;
}
else if(targetRowList.Value < rowdata.Value)
{
targetRowList = rowdata;
}
}
if(targetDataList.Count == targetRowList.Value)
{
//解析済みにする
targetRowList.Analyzed();
if(targetDataList[0].Col > 0)
{
if (_bitmapData[targetDataList[0].Row, targetDataList[0].Col - 1].IsValid() == false)
{
_bitmapData[targetDataList[0].Row, targetDataList[0].Col - 1].Mask();
}
}
if (targetDataList[targetDataList.Count - 1].Col < colNumbers.Count - 1)
{
if (_bitmapData[targetDataList[targetDataList.Count - 1].Row, targetDataList[targetDataList.Count - 1].Col + 1].IsValid() == false)
{
_bitmapData[targetDataList[targetDataList.Count - 1].Row, targetDataList[targetDataList.Count - 1].Col + 1].Mask();
}
}
}
rowlist.AnalyzeDatas.Reverse();
row++;
}
}
private void pattern11Col()
{
int col = 0;
foreach (var collist in colNumbers)
{
if (collist.IsAnalyzed())
{
col++;
continue;
}
collist.AnalyzeDatas.Reverse();
// 塗られている連続したマスを数える
List<List<BitmapData>> data = new List<List<BitmapData>>();
{
List<BitmapData> dataList = new List<BitmapData>();
for (int row = 0; row < rowNumbers.Count; row++)
{
if (_bitmapData[row, col].IsPainted() == true)
{
dataList.Add(_bitmapData[row, col]);
}
else
{
if (dataList.Count != 0)
{
data.Add(dataList);
dataList = new List<BitmapData>();
}
}
}
if (dataList.Count != 0)
{
data.Add(dataList);
}
if (data.Count == 0)
{
col++;
collist.AnalyzeDatas.Reverse();
continue;
}
}
List<BitmapData> targetDataList = null;
// 最大の物を取得する
foreach (var datalist in data)
{
if (targetDataList == null)
{
targetDataList = datalist;
}
else if (targetDataList.Count < datalist.Count)
{
targetDataList = datalist;
}
}
AnalyzeData targetColList = null;
foreach (var coldata in collist.AnalyzeDatas)
{
if (targetColList == null)
{
targetColList = coldata;
}
else if (targetColList.Value < coldata.Value)
{
targetColList = coldata;
}
}
if (targetDataList.Count == targetColList.Value)
{
//解析済みにする
targetColList.Analyzed();
if (targetDataList[0].Row > 0)
{
if (_bitmapData[targetDataList[0].Row - 1, targetDataList[0].Col].IsValid() == false)
{
_bitmapData[targetDataList[0].Row - 1, targetDataList[0].Col].Mask();
}
}
if (targetDataList[targetDataList.Count - 1].Row < colNumbers.Count - 1)
{
if (_bitmapData[targetDataList[targetDataList.Count - 1].Row + 1, targetDataList[targetDataList.Count - 1].Col].IsValid() == false)
{
_bitmapData[targetDataList[targetDataList.Count - 1].Row + 1, targetDataList[targetDataList.Count - 1].Col].Mask();
}
}
}
collist.AnalyzeDatas.Reverse();
col++;
}
}
実行結果はこうなりました。
まだ完全では無いですが、少し進みましたね。