示例#1
22
 static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary, string puzzle)
 {
     var placer = new PuzzlePlacer(board, puzzle);
     var cts = new CancellationTokenSource();
     var mre = new ManualResetEvent(false);
     ICrossBoard successFullBoard = null;
     foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary))
     {
         //boardWithPuzzle.WriteTo(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true });
         var gen = new CrossGenerator(dictionary, boardWithPuzzle);
         var t = Task.Factory.StartNew(() =>
                                   {
                                       foreach (var solution in gen.Generate())
                                       {
                                           successFullBoard = solution;
                                           cts.Cancel();
                                           mre.Set();
                                           break; //interested in the first one
                                       }
                                   }, cts.Token);
         if (cts.IsCancellationRequested)
             break;
     }
     mre.WaitOne();
     return successFullBoard;
 }
示例#2
5
 static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary)
 {
     var gen = new CrossGenerator(dictionary, board);
     board.Preprocess(dictionary);
     return gen.Generate().FirstOrDefault();
 }
示例#3
0
        static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary, string puzzle)
        {
            var         placer           = new PuzzlePlacer(board, puzzle);
            var         cts              = new CancellationTokenSource();
            var         mre              = new ManualResetEvent(false);
            ICrossBoard?successFullBoard = null;

            foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary))
            {
                //boardWithPuzzle.WriteTo(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true });
                var gen = new CrossGenerator(dictionary, boardWithPuzzle);
                var t   = Task.Factory.StartNew(() =>
                {
                    foreach (var solution in gen.Generate())
                    {
                        successFullBoard = solution;
                        cts.Cancel();
                        mre.Set();
                        break; //interested in the first one
                    }
                }, cts.Token);
                if (cts.IsCancellationRequested)
                {
                    break;
                }
            }

            mre.WaitOne();
            return(successFullBoard !);
        }
示例#4
0
        static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary)
        {
            var gen = new CrossGenerator(dictionary, board);

            board.Preprocess(dictionary);
            return(gen.Generate().FirstOrDefault());
        }
示例#5
0
        private static IEnumerable <ICrossBoard> GenerateCrossWords(ICrossBoard board, ICrossDictionary dictionary, string puzzle, CancellationToken cancellationToken)
        {
            if (puzzle != null)
            {
                var placer = new PuzzlePlacer(board, puzzle);
                foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary))
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    var gen = new CrossGenerator(dictionary, boardWithPuzzle);

                    // limit
                    int generatedCount = 0;

                    var generated = gen.Generate();
                    foreach (var solution in generated)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        generatedCount++;

                        if (generatedCount >= MAX_GENERATOR_COUNT)
                        {
                            break;
                        }

                        yield return(solution);
                    }
                }
            }
            else
            {
                var gen = new CrossGenerator(dictionary, board);
                board.Preprocess(dictionary);

                var crosswords = gen.Generate();

                // limit
                int generatedCount = 0;

                foreach (var resultBoard in crosswords)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    generatedCount++;

                    if (generatedCount >= MAX_GENERATOR_COUNT)
                    {
                        break;
                    }

                    yield return(resultBoard);
                }
            }
        }
示例#6
0
 public static void GenerateAndOutput(CrossGenerator generator, CommandStore commands, int maxSolutionsCount)
 {
     int solutionsCount = 0;
     foreach (var solution in generator.Generate())
     {
         lock (commands.Lock)
         {
             Console.WriteLine($"Solution {solutionsCount} found:");
             using (var w = OpenConsoleWriter())
                 solution.WriteTo(w);
         }
         if (++solutionsCount == maxSolutionsCount)
             break;
     }
     if (solutionsCount == 0)
         Console.WriteLine("Solution not found:");
 }
示例#7
0
 static void GeneratorWatcher(CrossGenerator generator)
 {
     while (_commandStore.Count > 0)
     {
         string command = _commandStore.PopCommand();
         if (command == null) break;
         if (command.Equals("h"))
         {
             //write help
             Console.WriteLine("Commands help: ");
             Console.WriteLine("h - show this help");
             Console.WriteLine("d - display cross");
             Console.WriteLine("p - display patterns");
             Console.WriteLine("c - check");
         }
         else if (command.Equals("d"))
         {
             using (var w = OpenConsoleWriter())
                 generator.Board.WriteTo(w);
         }
         else if (command.Equals("p"))
         {
             using (var w = OpenConsoleWriter())
                 generator.Board.WritePatternsTo(w, null);
         }
         else if (command.Equals("c"))
         {
             generator.Board.CheckPatternValidity();
         }
         else
         {
             Console.WriteLine("unknown command: {0}", command);
         }
     }
 }
示例#8
0
 static CrossGenerator CreateGenerator(string file, string dictFile, CommandStore commands)
 {
     DateTime startTime = DateTime.Now;
     var cb = CrossBoardCreator.CreateFromFile(file);
     var dict = new Dictionary(dictFile, cb.MaxWordLength);
     cb.Preprocess(dict);
     var gen = new CrossGenerator(dict, cb);
     gen.Watcher += GeneratorWatcher;
     return gen;
 }