0

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 を回避するにはどうすればよいですか?

4

0 に答える 0