前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
次はここを処理します。
数字が2つなのに対して、マスは2箇所、マスクされたマスを挟んで塗られているので、2つの数字はこのマスに繋がります。
なので、赤いところで囲まれた部分は塗ることができないのが分かります。
なので、ここをマスクします。
考え方は、マスクされていない部分のマスを抽出、リスト化し、塗られているマスを含むリストの数と数字の数が一致していた場合、塗られていないリストのマスをマスクする、という方法で行きます。
private void pattern12Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
rowlist.AnalyzeDatas.Reverse();
// マスクされていない連続したマスを数える
var data = getSquareDataListUnMaskedRow(row);
if(data == null)
{
row++;
rowlist.AnalyzeDatas.Reverse();
continue;
}
// 塗られているマスがあるところを確認する
int i = 0;
bool[] flg = new bool[data.Count];
for(i = 0; i < data.Count; i++)
{
flg[i] = false;
}
i = 0;
int count = 0;
foreach(var dataList in data)
{
foreach(var p in dataList)
{
if (p.IsPainted())
{
flg[i] = true;
count++;
break;
}
}
i++;
}
// 数字の数とflgの数を比較
if(rowlist.AnalyzeDatas.Count == count)
{
// flgが立っていないマスをマスクする
i = 0;
foreach(var dataList in data)
{
if(flg[i] == false)
{
foreach(var p in dataList)
{
p.Mask();
}
}
i++;
}
}
rowlist.AnalyzeDatas.Reverse();
row++;
}
}
private List<List<BitmapData>> getSquareDataListUnMaskedRow(int row)
{
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].IsMasked() == false)
{
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)
{
return null;
}
return data;
}
同じ処理をColに対しても行います。
実行結果はこちら。
だいぶ良い感じに埋まってきました。