前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
さて、今回はここを攻めていきます。
ここはマスクされたマスのすぐ隣に塗られたマスがあるので、当てはめる数字が分かればここも確実に塗ることができます。
ただ、前から塗る場合と後ろから塗る場合で、一緒に考えるとハマってしまうので、今回は前から塗るケースを考えました。
つまり、今回の対象はここになります。
解き方はこんな風に考えました。
空いているマスを抽出し、その端っこ(今回は先頭)が塗られているならば、数字に従って塗る。
そして、その次のマスは必ずマスクされますので、マスクする。
これでいきます。
// 解析パターンその5
// 端っこ(先頭)が塗られていたら塗る。
private void pattern5()
{
// Row
pattern5Row();
// Col
pattern5Col();
}
private void pattern5Row()
{
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].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)
{
row++;
continue;
}
}
int rowNumberIndex = 0;
foreach (var dataList in data)
{
// 端っこが塗られているか?
if (dataList[0].IsPainted())
{
// すでに処理済みか?
if (rowlist.AnalyzeDatas[rowNumberIndex].IsAnalyzed())
{
rowNumberIndex++;
continue;
}
// 数字に従ってマスを塗る
int count = 0;
foreach (var s in dataList)
{
if (count < rowlist.AnalyzeDatas[rowNumberIndex].Value)
{
s.Paint();
count++;
}
else
{
if (s.IsMasked() == false)
{
s.Mask();
}
rowlist.AnalyzeDatas[rowNumberIndex].Analyzed();
rowlist.CheckAnalyze();
break;
}
}
}
}
row++;
}
}
private void pattern5Col()
{
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].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)
{
col++;
continue;
}
}
int colNumberIndex = 0;
foreach (var dataList in data)
{
// 端っこが塗られているか?
if (dataList[0].IsPainted())
{
// すでに処理済みか?
if (collist.AnalyzeDatas[colNumberIndex].IsAnalyzed())
{
colNumberIndex++;
continue;
}
// 数字に従ってマスを塗る
int count = 0;
foreach (var s in dataList)
{
if (count < collist.AnalyzeDatas[colNumberIndex].Value)
{
s.Paint();
count++;
}
else
{
if (s.IsMasked() == false)
{
s.Mask();
}
collist.AnalyzeDatas[colNumberIndex].Analyzed();
collist.CheckAnalyze();
break;
}
}
}
}
col++;
}
}
考え方は簡単に思えますが、実際に実装して見ると結構複雑になったりします。
このコーディングが正しく動かすまでに何度もデバッグを繰り返しました。
プログラミングとはそういうもんです。
基本的にトライエラーで正しく動くまで修正するのです。
実行結果はこうなりました。
小さな一歩ですが、確実に行きましょう。
「【C#】【ピクロス】【ALTSEED】解析パターンその5」への2件のフィードバック