Esempio n. 1
0
        private bool NeighborValid(int x, int y, ref CustomRect[][] map)
        {
            Point p = new Point(x, y);
            bool inrange = InRange(p);
            if (!inrange) return false;
            bool notempty = map[x][y].Letter != ' ';

            return (notempty);
        }
Esempio n. 2
0
        private string[] ListPossibles(CustomRect[] crs, int len)
        {
            List<string> hs = new List<string>();
            string str = "";
            //Console.WriteLine("Possible words for length of {0}:", len);
            for (int i = 0; i < crs.Length; i++)
            {
                crs[i].UpdateChainValue(); //update just in case
                //if (crs[i].ChainedString.Equals("seam")) System.Diagnostics.Debugger.Break();
                //if (crs[i].ChainedString.Equals("button")) System.Diagnostics.Debugger.Break();
                if (!Regex.IsMatch(crs[i].ChainedString)) continue;
                if (crs[i].ChainedString.Length != len) continue;

                if (!SearchValid(FlattenChain(crs[i])))
                {

                    //DebugFlatten((crs[i]));
                    continue;
                }
                do
                {
                    str += crs[i].Letter;
                    crs[i] = crs[i].Parent;
                } while (crs[i] != null);
                hs.Add(Reverse(str));
                str = "";
            }
            hs = hs.Distinct().ToList();

            //check the word list
            List<string> finals = new List<string>();
            foreach (string word in Reader.WordList)
            {
                if (hs.Contains(word)) finals.Add(word);
            }

            #if (debug)
            foreach (string item in finals)
            {
                Console.WriteLine(item);
            }
            #endif
            return finals.ToArray();
        }
Esempio n. 3
0
 private bool NeighborValid(Point p, ref CustomRect[][] map)
 {
     return NeighborValid(p.x, p.y, ref map);
 }
Esempio n. 4
0
 private void DebugFlatten(CustomRect crs)
 {
     string str = "";
     do
     {
         str += crs.Letter;
         crs = crs.Parent;
     } while (crs != null);
     System.Diagnostics.Debug.WriteLine(Reverse(str));
 }
Esempio n. 5
0
 /// <summary>
 /// Returns from deepest to starting point
 /// </summary>
 private CustomRect[] FlattenChain(CustomRect cr)
 {
     Queue<CustomRect> qcr = new Queue<CustomRect>();
     do
     {
         qcr.Enqueue(cr);
         cr = cr.Parent;
     } while (cr != null);
     return qcr.ToArray();
 }
Esempio n. 6
0
 public CustomRect Clone()
 {
     CustomRect cr = new CustomRect(loc, Parent, Letter);
     cr.Visited = this.Visited;
     cr.UpdateChainValue();
     return cr;
 }
Esempio n. 7
0
 public static void UpdateGrid(ref CustomRect[][] main)
 {
     //col -> row row row :: col -> row row row
     //PrintGrid(ref main);
     for (int i = 0; i < main.Length; i++)
     {
         for (int k = main.Length - 1; k >= 1; k--)
         {
             for (int kk = k - 1; kk >= 0; kk--)
             {
                 if (main[k][i].Letter == ' ')
                 {
                     main[k][i].Letter = main[kk][i].Letter;
                     main[kk][i].Letter = ' ';
                     //PrintGrid(ref main);
                     //break; //stop inside looping
                 }
             }
         }
     }
 }
Esempio n. 8
0
        public CustomRect[][] RemoveWordFromGrid(ref CustomRect[] queue )
        {
            CustomRect[][] checkCR = new CustomRect[GridSize][];
            for (int i = 0; i < GridSize; i++)
            {
                checkCR[i] = new CustomRect[GridSize];
                for (int ii = 0; ii < GridSize; ii++)
                {
                    checkCR[i][ii] = CRGrid[i][ii].Clone();
                }
            }

            foreach (CustomRect item in queue)
            {
                checkCR[item.loc.x][item.loc.y].Letter = ' ';
            }

            return checkCR;
        }
Esempio n. 9
0
        public CustomRect[][] RemoveWordFromGrid(ref CustomRect chainedCR, ref CustomRect[][] map)
        {
            CustomRect[][] checkCR = new CustomRect[GridSize][];
            for (int i = 0; i < GridSize; i++)
            {
                checkCR[i] = new CustomRect[GridSize];
                for (int ii = 0; ii < GridSize; ii++)
                {
                    checkCR[i][ii] = map[i][ii].Clone();
                }
            }

            do
            {
                checkCR[chainedCR.loc.x][chainedCR.loc.y].Letter = ' ';
                chainedCR = chainedCR.Parent;
            } while (chainedCR != null);

            return checkCR;
        }
Esempio n. 10
0
        public CustomRect[][] HardCopyGrid(CustomRect[][] source)
        {
            CustomRect[][] checkCR = new CustomRect[GridSize][];
            for (int i = 0; i < GridSize; i++)
            {
                checkCR[i] = new CustomRect[GridSize];
                for (int ii = 0; ii < GridSize; ii++)
                {
                    checkCR[i][ii] = source[i][ii].Clone();
                }
            }

            return checkCR;
        }
Esempio n. 11
0
        public void Initialize()
        {
            WordLengths = Reader.WordLengths;
            CRGrid = new CustomRect[Reader.GridSize][];
            _Original = Reader.ProcessedInput;
            for (int i = 0; i < GridSize; i++)
            {
                CRGrid[i] = new CustomRect[GridSize];
                for (int ii = 0; ii < GridSize; ii++)
                {
                    CRGrid[i][ii] = new CustomRect(new Point(i, ii), null, _Original[i][ii]);
                }
            }

            for (int i = 0; i < GridSize; i++)
            {
                for (int ii = 0; ii < GridSize; ii++)
                {
                    CRGrid[i][ii].SearchableNeighbors = CloneSearchableNeighbors(new Point(i, ii), ref CRGrid);
                }
            }
        }
Esempio n. 12
0
 public void CopyGrid(ref CustomRect[][] target, CustomRect[][] source)
 {
     for (int i = 0; i < source.Length; i++)
     {
         for (int ii = 0; ii < source.Length; ii++)
         {
             target[i][ii] = source[i][ii];
         }
     }
 }
Esempio n. 13
0
 public CustomRect[] CloneSearchableNeighbors(Point center, ref CustomRect[][] map)
 {
     List<CustomRect> list = new List<CustomRect>(GetNeighborClone(center));
     for (int i = list.Count - 1; i >= 0; i--)
     {
         if (list[i].Visited) list.RemoveAt(i);
     }
     return list.ToArray();
 }
Esempio n. 14
0
 public CustomRect[] CloneSearchableNeighbors(Point center, CustomRect[] queue)
 {
     List<CustomRect> list = new List<CustomRect>(GetNeighborClone(center));
     for (int i = list.Count - 1; i >= 0; i--)
     {
         if ((queue.Contains(list[i])) || (list[i].Visited)) list.RemoveAt(i);
     }
     return list.ToArray();
 }
Esempio n. 15
0
        private bool SearchComplete(ref CustomRect[][] grid)
        {
            UpdateGrid(ref grid);
            bool allclear = true;
            for (int i = 0; i < GridSize; i++) //each column
            {
                if (grid[GridSize - 1][i].Letter != ' ')
                {
                    allclear = false;
                }
            }

            return allclear;
        }
Esempio n. 16
0
        /// <summary>
        /// Tries solve recursive
        /// </summary>
        /// <param name="contfrom">Wordlength input position</param>
        /// <param name="testg">tmp grid to use</param>
        /// <returns>true: go deeper false: wrong word go back</returns>
        public void Solve(int contfrom, CustomRect[][] testg)
        {
            CustomRect CRtmp;
            string[] wordlist;
            LinkedList<CustomRect> llcr = new LinkedList<CustomRect>();
            List<CustomRect> finalsbackup = new List<CustomRect>();
            CRGrid = testg;
            for (int k = contfrom; k < WordLengths.Length; k++)
            {
                for (int i = 0; i < GridSize; i++)
                {
                    for (int ii = 0; ii < GridSize; ii++)
                    {
                        if (CRGrid[i][ii].Letter == ' ') continue;
                        llcr.AddLast(CRGrid[i][ii].Clone());
                        TestBFS(llcr, WordLengths[k], finalsbackup);
                        llcr.Clear();
                    }
                }

                wordlist = ListPossibles(finalsbackup.ToArray(), WordLengths[k]);

                foreach (string word in wordlist)
                {
                    CRtmp = WordToCustomRect(word, finalsbackup.ToArray());
            #if false
                    if (CRtmp == null)
                    {
                        System.Diagnostics.Debugger.Break();
                    }
            #endif
                    CRGrid = RemoveWordFromGrid(ref CRtmp,ref CRGrid);
                    UpdateGrid(ref CRGrid);

                    if (SearchComplete(ref CRGrid))
                    {
                        SolutionStrings.Push(word);
                        completeflag = true;
                        return;
                    }

                    Solve(k + 1, HardCopyGrid(CRGrid));

                    CRGrid = HardCopyGrid(testg); //revert
                    if (completeflag)
                    {
                        SolutionStrings.Push(word);
                        if (k == 0)
                        {
                            ProcessCombination();
                            completeflag = false;
                            continue;
                        }
                        return;
                    }
                }
                return;
            }
        }
Esempio n. 17
0
 /// <summary>
 /// Checks if this queue will cause the remaining grid to be invalid
 /// </summary>
 /// <param name="queue"></param>
 /// <returns></returns>
 private bool SearchValid(CustomRect[] queue)
 {
     CustomRect[][] checkCR = RemoveWordFromGrid(ref queue);
     UpdateGrid(ref checkCR);
     bool flag = false;
     for (int i = 0; i < GridSize; i++) //each column
     {
         if (checkCR[GridSize - 1][i].Letter != ' ')
         {
             flag |= true;
         }
     }
     return flag || SearchComplete(ref checkCR);
     //return true;
 }
Esempio n. 18
0
 public CustomRect WordToCustomRect(string word, CustomRect[] crs)
 {
     string str = "";
     CustomRect backup;
     for (int i = 0; i < crs.Length; i++)
     {
         if (!SearchValid(FlattenChain(crs[i]))) continue;
         backup = crs[i];
         do
         {
             str += crs[i].Letter;
             crs[i] = crs[i].Parent;
         } while (crs[i] != null);
         //System.Diagnostics.Debug.WriteLine(Reverse(str));
         if (word.Equals(Reverse(str)))
         {
             return backup;
         }
         str = "";
     }
     return null;
 }
Esempio n. 19
0
 public CustomRect(Point pt, CustomRect p, char letter)
 {
     loc = pt;
     Parent = p;
     Visited = false;
     Letter = letter;
     Chained = GetChainValue();
 }
Esempio n. 20
0
 public static void PrintGrid(ref CustomRect[][] main)
 {
     for (int i = 0; i < main.Length; i++)
     {
         for (int ii = 0; ii < main.Length; ii++)
         {
             Console.Write(main[i][ii].Letter);
         }
         Console.WriteLine();
     }
 }