在C#中使用秒表

时间:2019-04-15 10:12:47

标签: computer-science stopwatch

有人知道我如何在此代码中添加计时器功能来解决数独难题吗? 我已经试过了Stopwatch类,但是我无法使其正常工作,因为我不知道确切的位置。我尝试过几个地方,但总是会出错。该代码的主要目的是工作,但我想添加一个计时器函数来查看代码运行的语言。

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; 
    }
  } 
}

2 个答案:

答案 0 :(得分:0)

“代码的主要目的是有效的,但是我想添加一个计时器函数来查看代码运行了多长时间”

为此,您可以使用System.Diagnostics.Stopwatchhttps://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=netframework-4.7.2)。 如果要查看函数执行需要多长时间,请在函数调用之前添加stopWatch.Start(),在函数调用之后添加stopWatch.Stop()。现在,根据您的方便,您可以使用stopWatch.Elapsed查看花费的总时间(以秒/毫秒为单位)。

答案 1 :(得分:0)

秒表对象通常用于(如您在此处所做的那样)测量事情需要多长时间。在此要记住的一件事是,在启动和停止操作之前,您需要花费所有时间来完成 ,因此请确保仅将您想要的实际代码放在两者之间。

using System.Diagnostics;

//...
void StopwatchUsingMethod()
{
  //A: Setup and stuff you don't want timed
  var timer = new Stopwatch();
  timer.Start();

  //B: Run stuff you want timed
  timer.Stop();

  TimeSpan timeTaken = timer.Elapsed;
  string foo = "Time taken: " + timeTaken.ToString(@"m\:ss\.fff"); 
}

Foo将在此处显示完成所需的分钟,秒和毫秒,但是如果花费超过59分钟则将显示为错误。有关TimeSpan的更多信息,请参见:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-timespan-format-strings

如果我正确理解了您的代码,则希望将所有内容放在A部分的第一行sdk.Display();中,包括第一行static void Main(string[] args) { //... sdk.Display(); var timer = new Stopwatch(); timer.Start(); sdk.Solve(sdk.NextAvailableCell(), new Point()); timer.Stop(); Console.WriteLine("\n\n\nSolved Grid"); //...you can use the time taken here } ,而仅将对Solve的调用放在B部分中,因此类似

$("#GrupoEmpresaAutoComplete").on("keyup", function () {
        searchText = $(this).val();
        searchText = searchText.toLowerCase();
        searchText = searchText.replace(/\s+/g, '');
        $('.CelebreTableRow > td').each(function () {
            var currentTdText = $(this).text(),
                showcurrentTd = ((currentTdText.toLowerCase()).replace(/\s+/g, '')).indexOf(searchText) !== -1;
            $(this).toggle(showcurrentTd);
        });
    });