前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
前回の続き。
前回は前から塗れるところをチェックしていきましたが、今回は後ろから塗れるところをチェックしていきます。
この時きちんと考えなくちゃいけないのは、データの順序。
今回、ここがぐっちゃになって一番ハマった。
前回のソースにも関連するのですが、
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
このrowlistをReverse()すると、元々の解析データ(rowNumbers)が壊れてしまうので、
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
var tempRowList = rowlist.Clone();
tempRowList.AnalyzeDatas.Reverse();
こんな感じでクローンを作成してReverse()しなくちゃいけない。
なので、クローンメソッドを追加。
class AnalyzeData
{
public AnalyzeData Clone()
{
var clone = new AnalyzeData(Value);
if (_analyzed)
{
clone.Analyzed();
}
return clone;
}
}
class AnalyzeListData
{
public AnalyzeListData Clone()
{
var clone = new AnalyzeListData();
clone.AnalyzeDatas = new List<AnalyzeData>();
foreach (var data in AnalyzeDatas)
{
clone.AnalyzeDatas.Add(data.Clone());
}
if (_analyzed)
{
clone.Analyzed();
}
return clone;
}
}
そしてパターン6の実装。
データの順番に気をつけて。
// 解析パターンその6
// 端っこ(後ろ)が塗られていたら塗る。
private void pattern6()
{
// Row
pattern6Row();
// Col
pattern6Col();
}
private void pattern6Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
var tempRowList = rowlist.Clone();
tempRowList.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)
{
// 端っこが塗られているか?
dataList.Reverse();
if (dataList[0].IsPainted())
{
// すでに処理済みか?
if (tempRowList.AnalyzeDatas[rowNumberIndex].IsAnalyzed())
{
rowNumberIndex++;
if (rowNumberIndex >= tempRowList.AnalyzeDatas.Count)
{
break;
}
continue;
}
// 数字に従ってマスを塗る
int count = 0;
foreach (var s in dataList)
{
if (count < tempRowList.AnalyzeDatas[rowNumberIndex].Value)
{
s.Paint();
count++;
}
else
{
if (s.IsMasked() == false)
{
s.Mask();
}
tempRowList.AnalyzeDatas[rowNumberIndex].Analyzed();
tempRowList.CheckAnalyze();
break;
}
}
}
rowNumberIndex++;
if (rowNumberIndex >= tempRowList.AnalyzeDatas.Count)
{
break;
}
}
row++;
}
}
private void pattern6Col()
{
int col = 0;
foreach (var collist in colNumbers)
{
if (collist.IsAnalyzed())
{
col++;
continue;
}
// 塗った場所が端っこならそこを塗る
// マスクされていない部分をリスト化して取得する
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;
data.Reverse();
foreach (var dataList in data)
{
// 端っこが塗られているか?
dataList.Reverse();
if (dataList[0].IsPainted())
{
// すでに処理済みか?
if (collist.AnalyzeDatas[colNumberIndex].IsAnalyzed())
{
colNumberIndex++;
if (colNumberIndex >= collist.AnalyzeDatas.Count)
{
break;
}
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;
}
}
}
colNumberIndex++;
if(colNumberIndex >= collist.AnalyzeDatas.Count)
{
break;
}
}
col++;
}
}
とりあえず、1回このロジックを当てはめてみる。
狙い通りに動いているみたいです。
なので、最後まで処理させてみる。
お、解けた。
多分、まだ完璧では無いですが、これで一歩前進です。
「【C#】【ピクロス】【ALTSEED】解析パターンその6」への1件のフィードバック