/// <summary> /// Seperate a one-group crozzle into multi-group crozzle /// </summary> /// <param name="cp">One-group crozzle</param> /// <returns>One multi-group crozzle</returns> public static CrozzlePartial SeperateGroups(CrozzlePartial cp) { int bestScore = 0; List <Word> bestUsedWords = new List <Word>(); for (int i = 0; i < cp.GetUsedWord().Count; i++) { List <Word> usedWords = new List <Word>(); for (int j = 0; j < cp.GetUsedWord().Count; j++) { usedWords.Add(cp.GetUsedWord()[j]); } Word deleteWord = cp.GetUsedWord()[i]; usedWords.Remove(cp.GetUsedWord()[i]); int groups; try { WordGroupServiceClient ws; string endpoint = "BasicHttpBinding_IWordGroupService"; ws = new WordGroupServiceClient(endpoint); Grid grid = new Grid(PublicInfo.GetFullRows(), PublicInfo.GetFullColumns(), usedWords); string[] stringGrid = ConvertToString(grid.GetGrid(), PublicInfo.GetFullRows(), PublicInfo.GetFullColumns()); groups = ws.Count(stringGrid); } catch { // use local group calculation method if online method fail groups = CalculateGroup(usedWords); } int score = CalculateScoreAfterRemovingAWord(cp, cp.GetUsedWord()[i]); if (groups >= PublicInfo.GetMinGroups() && groups <= PublicInfo.GetMaxGroups() && score > bestScore && CheckAllIntersections(usedWords)) { bestScore = score; bestUsedWords = usedWords; } } // generate a multi-groups crozzle with used words cp.SetUsedWord(bestUsedWords); cp.SetScore(bestScore); cp.SetGrid(new Grid(PublicInfo.GetFullRows(), PublicInfo.GetFullColumns(), bestUsedWords)); return(cp); }