有人知道我如何在此代码中添加计时器功能来解决数独难题吗? 我已经试过了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;
}
}
}
答案 0 :(得分:0)
“代码的主要目的是有效的,但是我想添加一个计时器函数来查看代码运行了多长时间”
为此,您可以使用System.Diagnostics.Stopwatch
(https://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);
});
});