Guest

Untitled

By: a guest on Jan 28th, 2012  |  syntax: C#  |  size: 3.55 KB  |  hits: 24  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.  
  9.     class Program
  10.     {
  11.         int width = 3;
  12.         int height = 3;
  13.         int min = 0;
  14.         int max = 100;
  15.  
  16.         static void Main(string[] args)
  17.         {
  18.             //Punkt startowy;
  19.             var p = new Program();
  20.             p.Run();
  21.         }
  22.         int[,] CreateRandomMatrix(int width, int height, int min, int max)
  23.         {
  24.             var array = new int[width, height];
  25.             var random = new Random();
  26.             for (int x = 0; x < width; x++)
  27.                 for (int y = 0; y < height; y++)
  28.                 {
  29.                     array[x, y] = random.Next() % (max-min)+min;
  30.                 }
  31.             return array;
  32.         }
  33.         int CheckPath(int[,] matrix, bool[] path)
  34.         {
  35.             int x = 0; int y = height - 1;
  36.             int result = -1;
  37.             for (int i = 0; i < path.Length; i++)
  38.             {
  39.                 result += matrix[x, y];
  40.                 if (path[i] == false) y--;
  41.                 else x++;
  42.                 if (x >= width || y >= height) return -1; //wyszlo poza macierz
  43.             }
  44.             return result;
  45.         }
  46.         public void Run()
  47.         {
  48.  
  49.             var array = CreateRandomMatrix(width, height, min, max); //tworzenie losowej macierzy
  50.  
  51.             var watch = System.Diagnostics.Stopwatch.StartNew(); //tylko do pomiaru czasu
  52.             Sum(array, 0, height-1, "", 0,""); //wywolanie rekurencji
  53.             watch.Stop(); //koniec liczenia czasu
  54.  
  55.             string matrixString = "";
  56.             for (int y = 0; y < height; y++)
  57.             {
  58.                 for (int x = 0; x < width; x++)
  59.                 {
  60.                     matrixString += array[x, y] + " ";
  61.                 }
  62.                 matrixString += "\n"; //tworzenie stringu do wypisania w celach diagnostycznych
  63.             }
  64.            
  65.  
  66.             Console.WriteLine(matrixString);
  67.             Console.WriteLine("Najlepsza sciezka to " + winnerPath+" z suma "+ winnerSum);
  68.             Console.WriteLine("Funkcja rekurencyjna wykonala sie " + evaluations + " razy, w czasie " + watch.Elapsed.TotalMilliseconds + " ms");
  69.             Console.WriteLine("Zwycieska sciezka byla zastepowana " + winnerChanges + " razy");
  70.             Console.WriteLine("Sekwencja " + winnerSequence + " razy");
  71.             Console.ReadKey();
  72.         }
  73.         int winnerChanges;
  74.         string winnerPath;
  75.         int winnerSum = 1000000;
  76.         int evaluations = 0;
  77.         string winnerSequence;
  78.         void Sum(int[,] matrix, int x, int y, string path, int sum, string seq)
  79.         {
  80.             evaluations++; //w celach diagnostycznych
  81.             if (x >= width || sum > winnerSum || y < 0)
  82.                 return; // jesli wyszlo poza zakres, lub suma jest wieksza niz aktualna najlepsza, nie idziemy dalej
  83.             sum += matrix[x, y];
  84.             seq += matrix[x, y]+ "+";
  85.  
  86.             if (x == width - 1 && y == 0 && sum < winnerSum) //jesli sciezka doszla do celu i jest najlepsza, nalezy ja dopisac
  87.             {
  88.                 winnerSum = sum;
  89.                 winnerPath = path;
  90.                 winnerChanges++; // w celach diagnostycznych
  91.                 winnerSequence = seq;
  92.             }
  93.             Sum(matrix, x + 1, y, path + "1", sum, seq); //funkcja rekurencyjna stworzy dwie odnogi
  94.             Sum(matrix, x, y - 1, path + "0", sum, seq); //jest to tak jakby drzewo ktore sprawdzi wszystkie kombinacje bez potrzeby petli
  95.  
  96.         }
  97.     }
  98. }