Exemple #1
0
 /// <summary>
 /// Creates ImageSolver
 /// </summary>
 /// <param name="splittedImage">SplittedImage which is used to rearange its actual ImagePart layout</param>
 public ImageSolver(SplittedImage splittedImage, bool cheater)
 {
     _splittedImage = splittedImage;
     if (cheater)
     {
         nextImagePosition = new int[9] {
             0, 3, 8, 6, 1, 2, 5, 4, 7
         };
     }
     nextImagePosition = new int[9] {
         0, 1, 2, 3, 4, 5, 6, 7, 8
     };
 }
Exemple #2
0
        private void PrepareThreads()
        {
            Console.WriteLine($"Start {DateTime.Now}");
            DateTime date = DateTime.Now;

            object[] parametres = new object[7];



            parametres[2] = _numberOfThreads;
            parametres[3] = _mutex;
            parametres[4] = _solved;
            parametres[5] = _result;
            int move = 0;

            for (int i = 0; i < _numberOfThreads; i++)
            {
                parametres[1] = _defaultImagePosition;
                SplittedImage tmpSplittedImage = new SplittedImage(_uriToImage, false);
                parametres[0]   = tmpSplittedImage;
                parametres[6]   = move;
                _threadArray[i] = new Thread(ThreadJob)
                {
                    Name = $"Smajlici_Thread_#{i}"
                };
                _threadArray[i].Start((object)parametres);
                NextPermutation(_defaultImagePosition);
                move++;
            }



            foreach (var threads in _threadArray)
            {
                threads.Join();
            }
            TimeSpan duration = DateTime.Now - date;

            Console.WriteLine($"Threads Ended {DateTime.Now} in {move} moves, duration: {duration}");
        }
Exemple #3
0
        protected static bool NextRotate(SplittedImage _splittedImage)
        {
            bool existsNextState = true;

            for (int i = 0; i < 9; i++)
            {
                ImagePart part = _splittedImage.GetImagePart((SplittedImage.ImagePosittion)i);
                if (i == 8 && part.Rotation == ImagePartRotation.D270)
                {
                    existsNextState = false;
                }
                if (part.Rotation == ImagePartRotation.D270 && i != 8)
                {
                    continue;
                }
                for (int j = i; j >= 0; j--)
                {
                    _splittedImage.RotateImagePart((SplittedImage.ImagePosittion)j);
                }
                break;
            }

            return(existsNextState);
        }
Exemple #4
0
        static void ThreadJob(object param)
        {
            object[]      paramArray    = (object[])param;
            SplittedImage splittedImage = (SplittedImage)paramArray[0];

            int[]                 nextImagePosition = (int[])paramArray[1];
            int                   skips             = (int)paramArray[2];
            object                zamek             = paramArray[3];
            MyRef <bool>          solved            = (MyRef <bool>)paramArray[4];
            MyRef <SplittedImage> result            = (MyRef <SplittedImage>)paramArray[5];
            int                   move      = (int)paramArray[6];
            int                   modulator = 0;

            int[] internalnextImagePosition;
            lock (zamek)
            {
                internalnextImagePosition = nextImagePosition;
            }



            int[] actualImagePositions = new int[9];
            void GetActualImagePosition(SplittedImage splittedImag, int[] imagePositionArray)
            {
                for (int a = 0; a < 9; a++)
                {
                    imagePositionArray[a] = splittedImag.GetImagePart((SplittedImage.ImagePosittion)a).Id;
                }
            }

            do
            {
                lock (zamek)
                {
                    move++;
                    if (splittedImage.CheckImageCorectness() && solved.Value == false)
                    {
                        solved.Value = true;
                        GetActualImagePosition(result.Value, actualImagePositions);
                        GetActualImagePosition(splittedImage, internalnextImagePosition);
                        for (int a = 0; a < 9; a++)
                        {
                            if (actualImagePositions[a] != internalnextImagePosition[a])
                            {
                                int index;
                                for (index = 0; index < 9; index++)
                                {
                                    if (internalnextImagePosition[a] == actualImagePositions[index])
                                    {
                                        break;
                                    }
                                }
                                result.Value.MoveImagePart((SplittedImage.ImagePosittion)index,
                                                           (SplittedImage.ImagePosittion)a);
                                GetActualImagePosition(result.Value, actualImagePositions);
                            }
                            result.Value.GetImagePart((SplittedImage.ImagePosittion)a).Rotation = splittedImage
                                                                                                  .GetImagePart((SplittedImage.ImagePosittion)a)
                                                                                                  .Rotation;
                            if (result.Value.CheckImageCorectness())
                            {
                                break;
                            }
                        }
                        break;
                    }
                    else if (solved.Value == true)
                    {
                        break;
                    }
                }


                modulator++;

                if (modulator % 10 == 0)
                {
                    Console.WriteLine($"{Thread.CurrentThread.Name} -- {move}");
                }

                GetActualImagePosition(splittedImage, actualImagePositions);
                for (int a = 0; a < 9; a++)
                {
                    if (actualImagePositions[a] != internalnextImagePosition[a])
                    {
                        int index;
                        for (index = 0; index < 9; index++)
                        {
                            if (internalnextImagePosition[a] == actualImagePositions[index])
                            {
                                break;
                            }
                        }
                        splittedImage.MoveImagePart((SplittedImage.ImagePosittion)index,
                                                    (SplittedImage.ImagePosittion)a);
                        GetActualImagePosition(splittedImage, actualImagePositions);
                    }

                    if (splittedImage.CheckImageCorectness())
                    {
                        break;
                    }
                }
                do
                {
                    if (splittedImage.CheckImageCorectness())
                    {
                        break;
                    }
                } while (NextRotate(splittedImage));
            } while (NextPermutation(internalnextImagePosition));
        }