示例#1
0
        public static bool Filler(ref Panel pl)
        {
            bool changed = false;

            //check blocks
            for (int y = 0; y < 9; y++)
            {
                for (int x = 0; x < 9; x++)
                {
                    if (pl[x, y].Number == SudoNum.Unknown && pl[x, y].CandidateNumber.Count == 1)
                    {
                        SudoNum tmp = pl[x, y].CandidateNumber.GetNumbers()[0];
                        pl[x, y].Number = tmp;
                        RowExpel(ref pl, y, x, tmp);
                        ColumnExpel(ref pl, x, y, tmp);
                        RegionExpel(ref pl, Panel.GetRegion(x, y), Panel.GetRegionNumber(x, y), tmp);
                        changed = true;
                    }
                }
            }
            //check regions
            for (int r = 0; r < 9; r++)
            {
                int[] counter = new int[10];
                for (int n = 0; n < 9; n++)
                {
                    if (pl[Panel.GetX(r, n), Panel.GetY(r, n)].Number != SudoNum.Unknown)
                    {
                        continue;
                    }
                    foreach (SudoNum item in pl[Panel.GetX(r, n), Panel.GetY(r, n)].CandidateNumber.GetNumbers())
                    {
                        counter[(int)item]++;
                    }
                }
                for (int i = 1; i < 10; i++)
                {
                    if (counter[i] == 1)
                    {
                        for (int n = 0; n < 9; n++)
                        {
                            if (pl[Panel.GetX(r, n), Panel.GetY(r, n)].CandidateNumber.HasNumber((SudoNum)i))
                            {
                                pl[Panel.GetX(r, n), Panel.GetY(r, n)].Number = (SudoNum)i;
                                RowExpel(ref pl, Panel.GetY(r, n), Panel.GetX(r, n), (SudoNum)i);
                                ColumnExpel(ref pl, Panel.GetX(r, n), Panel.GetY(r, n), (SudoNum)i);
                                changed = true;
                            }
                        }
                    }
                }
            }
            return(changed);
        }
示例#2
0
 public static void RegionExpel(ref Panel pl, int region, int except, SudoNum value)
 {
     for (int i = 0; i < 9; i++)
     {
         if (i == except)
         {
             continue;
         }
         pl[Panel.GetX(region, i), Panel.GetY(region, i)].CandidateNumber.Remove(value);
     }
 }