前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
こちらの問題を解いてみました。
もちろん一発で解けるとは思っていませんでした。
しかし、ここまでハマるとは・・・
解析パターン5にバグがあって、
いろいろコードを書き換えながら試行錯誤していったんですが、
結局、コードと格闘すること5時間。
解けました。
大きな変更としては、解析済みの数字に対して、きちんと解析済みフラグを設定しましょう、ということで、
要するに、
縦の数字を埋めていったら、横の数字も出来上がっているにもかかわらず、解析済みフラグが立っていないケースがあって、それで動きがおかしくなっていたので、きちんと解析完了フラグを立てましょう、ということを入れました。
private void checkAnalyze()
{
checkAnalyzeRowBefore();
checkAnalyzeRowAfter();
checkAnalyzeColBefore();
checkAnalyzeColAfter();
}
private void checkAnalyzeRowBefore()
{
int row = 0;
foreach (var rowList in rowNumbers)
{
if (rowList.IsAnalyzed())
{
row++;
continue;
}
rowList.AnalyzeDatas.Reverse();
int rowIndex = 0;
foreach(var rowData in rowList.AnalyzeDatas)
{
if (rowData.IsAnalyzed())
{
rowIndex++;
}
else
{
break;
}
}
if (rowIndex == rowList.AnalyzeDatas.Count)
{
rowList.AnalyzeDatas.Reverse();
row++;
continue;
}
int painted = 0;
int count = 0;
for (int col = 0; col < colNumbers.Count; col++)
{
if (_bitmapData[row, col].IsPainted())
{
painted++;
}
else if (_bitmapData[row, col].IsMasked())
{
if(count == rowIndex)
{
if (rowList.AnalyzeDatas[rowIndex].Value == painted)
{
rowList.AnalyzeDatas[rowIndex].Analyzed();
rowList.CheckAnalyze();
}
}
else
{
count++;
}
}
else
{
rowList.AnalyzeDatas.Reverse();
row++;
break;
}
}
}
}
private void checkAnalyzeRowAfter()
{
int row = 0;
foreach (var rowList in rowNumbers)
{
if (rowList.IsAnalyzed())
{
row++;
continue;
}
int rowIndex = 0;
foreach (var rowData in rowList.AnalyzeDatas)
{
if (rowData.IsAnalyzed())
{
rowIndex++;
}
else
{
break;
}
}
if(rowIndex == rowList.AnalyzeDatas.Count)
{
row++;
continue;
}
int painted = 0;
int count = 0;
for (int col = colNumbers.Count - 1; col >= 0; col--)
{
if (_bitmapData[row, col].IsPainted())
{
painted++;
}
else if (_bitmapData[row, col].IsMasked())
{
if (count == rowIndex)
{
if (rowList.AnalyzeDatas[rowIndex].Value == painted)
{
rowList.AnalyzeDatas[rowIndex].Analyzed();
rowList.CheckAnalyze();
}
}
else
{
count++;
}
}
else
{
row++;
break;
}
}
}
}
private void checkAnalyzeColBefore()
{
int col = 0;
foreach (var colList in colNumbers)
{
if (colList.IsAnalyzed())
{
col++;
continue;
}
colList.AnalyzeDatas.Reverse();
int colIndex = 0;
foreach (var colData in colList.AnalyzeDatas)
{
if (colData.IsAnalyzed())
{
colIndex++;
}
else
{
break;
}
}
if (colIndex == colList.AnalyzeDatas.Count)
{
colList.AnalyzeDatas.Reverse();
col++;
continue;
}
int painted = 0;
int count = 0;
for (int row = 0; row < rowNumbers.Count; row++)
{
if (_bitmapData[row, col].IsPainted())
{
painted++;
}
else if (_bitmapData[row, col].IsMasked())
{
if (count == colIndex)
{
if (colList.AnalyzeDatas[colIndex].Value == painted)
{
colList.AnalyzeDatas[colIndex].Analyzed();
colList.CheckAnalyze();
}
}
else
{
count++;
}
}
else
{
colList.AnalyzeDatas.Reverse();
col++;
break;
}
}
}
}
private void checkAnalyzeColAfter()
{
int col = 0;
foreach (var colList in colNumbers)
{
if (colList.IsAnalyzed())
{
col++;
continue;
}
int colIndex = 0;
foreach (var colData in colList.AnalyzeDatas)
{
if (colData.IsAnalyzed())
{
colIndex++;
}
else
{
break;
}
}
if (colIndex == colList.AnalyzeDatas.Count)
{
col++;
continue;
}
int painted = 0;
int count = 0;
for (int row = rowNumbers.Count - 1; row >= 0; row--)
{
if (_bitmapData[row, col].IsPainted())
{
painted++;
}
else if (_bitmapData[row, col].IsMasked())
{
if (count == colIndex)
{
if (colList.AnalyzeDatas[colIndex].Value == painted)
{
colList.AnalyzeDatas[colIndex].Analyzed();
colList.CheckAnalyze();
}
}
else
{
count++;
}
}
else
{
col++;
break;
}
}
}
}
細かい所は、直接gitHubのコードを見て欲しく。
何より大変だったのは、既存部分を変更することにより、過去の問題が解けなくなる可能性もあり、その確認のため、過去問を引っ張り出してきたこと。
セーブ&ロード機能実装してて正解だったわ。
無かったら確実に発狂してる。
とはいえ、この作業に大半の時間を使ってしまったので、他の作業ができなかったので、今日は他の作業に取りかかろう。