Windows Phone 用に独自の WordSearch ゲームを作成しようとしていますが、それを解決するためのアルゴリズムを見つけました。私の問題は、アルゴリズムが再帰を使用していて、6 ~ 8 回の呼び出し後に StackOverflowException が発生することです。
- array : char[,] には 2D テーブルの文字が含まれます
- i,a: 配列内の現在位置の座標
- width,height: 配列のサイズ
- build: 作成しようとしている文字列 (単語自体)
- 対象: bool[,] は既に使用されている文字用です
アルゴリズムは次のとおりです。
...
enum WordType : byte
{
FullWord,
PartialWord,
FullWordAndPartialWord
}
...
static Dictionary<string, WordType> _words = new Dictionary<string, WordType>();
static Dictionary<string, bool> _found = new Dictionary<string, bool>();
void Search(char[,] array, int i, int a, int width, int height, string build, bool[,] covered)
{
if (i >= width || i < 0 || a >= height || a < 0)
{
return;
}
if (covered[a, i])
{
return;
}
char letter = array[a, i];
string pass = build + letter;
WordType value;
if (_words.TryGetValue(pass, out value))
{
if (value == WordType.FullWord ||
value == WordType.FullWordAndPartialWord)
{
if (!_found.ContainsKey(pass))
{
_found.Add(pass, true);
}
}
if (value == WordType.PartialWord ||
value == WordType.FullWordAndPartialWord)
{
bool[,] cov = new bool[height, width];
for (int i2 = 0; i2 < width; i2++)
{
for (int a2 = 0; a2 < height; a2++)
{
cov[a2, i2] = covered[a2, i2];
}
}
cov[a, i] = true;
Search(array, i + 1, a, width, height, pass, cov);
Search(array, i, a + 1, width, height, pass, cov);
Search(array, i + 1, a + 1, width, height, pass, cov);
Search(array, i - 1, a, width, height, pass, cov);
Search(array, i, a - 1, width, height, pass, cov);
Search(array, i - 1, a - 1, width, height, pass, cov);
Search(array, i - 1, a + 1, width, height, pass, cov);
Search(array, i + 1, a - 1, width, height, pass, cov);
}
}
}
そして、私がそれを呼んでいるとき:
for (int i = 0; i < width; i++)
{
for (int a = 0; a < height; a++)
{
Search(array, i, a, width, height, "", covered);
}
}
Exception を回避するにはどうすればよいですか?