- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- int width = 3;
- int height = 3;
- int min = 0;
- int max = 100;
- static void Main(string[] args)
- {
- //Punkt startowy;
- var p = new Program();
- p.Run();
- }
- int[,] CreateRandomMatrix(int width, int height, int min, int max)
- {
- var array = new int[width, height];
- var random = new Random();
- for (int x = 0; x < width; x++)
- for (int y = 0; y < height; y++)
- {
- array[x, y] = random.Next() % (max-min)+min;
- }
- return array;
- }
- int CheckPath(int[,] matrix, bool[] path)
- {
- int x = 0; int y = height - 1;
- int result = -1;
- for (int i = 0; i < path.Length; i++)
- {
- result += matrix[x, y];
- if (path[i] == false) y--;
- else x++;
- if (x >= width || y >= height) return -1; //wyszlo poza macierz
- }
- return result;
- }
- public void Run()
- {
- var array = CreateRandomMatrix(width, height, min, max); //tworzenie losowej macierzy
- var watch = System.Diagnostics.Stopwatch.StartNew(); //tylko do pomiaru czasu
- Sum(array, 0, height-1, "", 0,""); //wywolanie rekurencji
- watch.Stop(); //koniec liczenia czasu
- string matrixString = "";
- for (int y = 0; y < height; y++)
- {
- for (int x = 0; x < width; x++)
- {
- matrixString += array[x, y] + " ";
- }
- matrixString += "\n"; //tworzenie stringu do wypisania w celach diagnostycznych
- }
- Console.WriteLine(matrixString);
- Console.WriteLine("Najlepsza sciezka to " + winnerPath+" z suma "+ winnerSum);
- Console.WriteLine("Funkcja rekurencyjna wykonala sie " + evaluations + " razy, w czasie " + watch.Elapsed.TotalMilliseconds + " ms");
- Console.WriteLine("Zwycieska sciezka byla zastepowana " + winnerChanges + " razy");
- Console.WriteLine("Sekwencja " + winnerSequence + " razy");
- Console.ReadKey();
- }
- int winnerChanges;
- string winnerPath;
- int winnerSum = 1000000;
- int evaluations = 0;
- string winnerSequence;
- void Sum(int[,] matrix, int x, int y, string path, int sum, string seq)
- {
- evaluations++; //w celach diagnostycznych
- if (x >= width || sum > winnerSum || y < 0)
- return; // jesli wyszlo poza zakres, lub suma jest wieksza niz aktualna najlepsza, nie idziemy dalej
- sum += matrix[x, y];
- seq += matrix[x, y]+ "+";
- if (x == width - 1 && y == 0 && sum < winnerSum) //jesli sciezka doszla do celu i jest najlepsza, nalezy ja dopisac
- {
- winnerSum = sum;
- winnerPath = path;
- winnerChanges++; // w celach diagnostycznych
- winnerSequence = seq;
- }
- Sum(matrix, x + 1, y, path + "1", sum, seq); //funkcja rekurencyjna stworzy dwie odnogi
- Sum(matrix, x, y - 1, path + "0", sum, seq); //jest to tak jakby drzewo ktore sprawdzi wszystkie kombinacje bez potrzeby petli
- }
- }
- }