数独パズルを解決するタイマー関数をこのコードに追加する方法を誰かが知っていますか?ストップウォッチクラスを試しましたが、どこに置くべきか正確にわからないため、機能しません。私はいくつかの場所を試しましたが、常にエラーが発生します。コードの主な目的は機能しますが、タイマー関数を追加して、コードの実行時間を確認したいと思います。
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;
}
}
}
「コードの主な目的は機能しますが、タイマー機能を追加して、コードの実行時間を確認したいのですが」
これには_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
_を使用して、かかった合計時間(秒/ミリ秒など)を確認できます。