web-dev-qa-db-fra.com

Utilisation du chronomètre en C #

Est-ce que quelqu'un sait comment ajouter une fonction de minuterie à ce code qui résout les puzzles sudoku? J'ai essayé la classe Chronomètre mais je n'arrive pas à la faire fonctionner car je ne sais pas exactement où la mettre. J'ai essayé plusieurs endroits mais j'ai toujours des erreurs. Le but principal du code fonctionne mais j'aimerais ajouter une fonction de minuterie pour voir combien de temps le code a fonctionné.

using System;

namespace SuDoKu
{
  public class SuDoKu
  {
    private int[,] grid;

    public SuDoKu()
    { 
        grid = new int[9, 9];
    } 
     static void Main(string[] args)
     {
        SuDoKu sdk = new SuDoKu();

        int[,] grd = {
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                     { 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

        for(int i = 0; i < 9; i++)
            for(int j = 0; j < 9; j++)
                sdk.EnterToGrid(grd[i, j], new Point(i, j));

        Console.WriteLine("Original Grid"); 

        sdk.Display(); 

        sdk.Solve(sdk.NextAvailableCell(), new Point()); 

        Console.WriteLine("\n\n\nSolved Grid"); 

        sdk.Display(); 

        Console.WriteLine();
    }

    public void Display()
    {
        for(int i = 0; i < 9; i++)
        {
            Console.WriteLine();

            for(int j = 0; j < 9; j++)
            {
                if(ShowFromGrid(new Point(i, j)) == 0) {
                    Console.Write("0 ");
                }
                else
                {
                    Console.Write(ShowFromGrid(new Point(i, j)) + " ");
                }

                if(j == 2 || j == 5)
                {
                    Console.Write("| ");
                }
            }
            if(i == 2 || i == 5) {

                Console.Write("\n------|-------|------ ");
            }
        }
    }
    public void EnterToGrid(int num, Point pos) {
        grid[pos.X, pos.Y] = num;
    }

    public int ShowFromGrid(Point pos) {
        return grid[pos.X, pos.Y];
    }

    public void Solve(Point pos, Point prevPos) {

        if(pos.X < 9 && pos.Y < 9)
        {
            Point posPrev = new Point();

            if(grid[pos.X, pos.Y] == 0)
            {
                for(int i = 1; i <= 9; i++)
                {
                    if(IsThisNumberPossibleInTheGrid(i, pos))
                    {
                        grid[pos.X, pos.Y] = i;

                        posPrev.X = pos.X;

                        posPrev.Y = pos.Y;

                        Point posNext = NextAvailableCell();

                        if(!posNext.Equals(new Point()))

                            Solve(posNext, posPrev);
                    }
                }
                if(grid[pos.X, pos.Y] == 0)
                {
                    if(!prevPos.Equals(new Point()))

                        grid[prevPos.X, prevPos.Y] = 0; 

                    return;
                }
            }
        }
        else
        {
            Point posNext = NextAvailableCell();

            if(!posNext.Equals(new Point()))
                Solve(posNext, pos);
        }
    }

    public Point NextAvailableCell()
    {
        for(int i = 0; i < 9; i++)
            for(int j = 0; j < 9; j++)
                if(grid[i, j] == 0)
                    return new Point(i, j);

        return new Point();
    }

    public bool IsThisNumberPossibleInTheGrid(int num, Point pos) {

        if(IsThisNumberPossibleInTheBlock(num, pos))
        {
            for(int i = 0; i < 9; i++)
            {
                if(grid[i, pos.Y] == num && pos.X != i)
                {
                    return false;
                }

                if(grid[pos.X, i] == num && pos.Y != i)
                {
                    return false;
                }
            }
            return true;
        }
        return false;
    }

    public bool IsThisNumberPossibleInTheBlock(int num, Point pos)
    {
        Point Grid = new Point();

        Grid.X = (pos.X >= 0 && pos.X <= 2) ? 0 : ((pos.X >= 3 && pos.X <= 5) ? 3 : ((pos.X >= 6 && pos.X <= 8) ? 6 : -1));
        Grid.Y = (pos.Y >= 0 && pos.Y <= 2) ? 0 : ((pos.Y >= 3 && pos.Y <= 5) ? 3 : ((pos.Y >= 6 && pos.Y <= 8) ? 6 : -1));

        if(!Grid.Equals(new Point()))
        {
            for(int i = Grid.X; i < Grid.X + 3; i++)
            {
                for(int j = Grid.Y; j < Grid.Y + 3; j++)
                {
                    if(grid[i, j] == num && !pos.Equals(new Point(i, j)))
                        return false;
                }
            }
            return true;
        }
        return false;
    }
}

  public class Point
  {
    public int X;

    public int Y;

    public Point()
    {
        this.X = -1;
        this.Y = -1;
    }

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public bool Equals(Point p)
    {
        return (this.X == p.X && this.Y == p.Y) ? true : false;
    }
  }
}
6
PRO_grammer

"Le but principal du code fonctionne mais j'aimerais ajouter une fonction de minuterie pour voir combien de temps le code a fonctionné"

Pour cela, vous pouvez utiliser System.Diagnostics.Stopwatch ( https://docs.Microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=netframework-4.7.2 ). Si vous souhaitez voir le temps nécessaire à l'exécution d'une fonction, ajoutez stopWatch.Start() avant et stopWatch.Stop() après l'appel de la fonction. Vous pouvez maintenant voir le temps total qu'il a fallu (en secondes/millisecondes, etc.) en utilisant stopWatch.Elapsed, Selon votre convenance.

1
afrose