PDA

View Full Version : یک توضیح مختصر در مورد کدهای پروزه "هشت وزیر"



leontry89
دوشنبه 02 دی 1392, 13:16 عصر
دوستان می خواستم یک توضیح مختصر در مورد این کدهای هوش مصنوعی که برای پروژه هوش مصنوعی هست بدید. ممنون میشم.
using System;
using System.Collections.Generic;
using System.Text;

namespace NQueens.HelperClasses
{
public class Queen
{
// در صورت نیاز برای محاسبه ی تعداد حالات بیشتر می توان این مقدار را افزایش داد
// اما زمان اجرای آن طولانی تر می شود
public static readonly int MaxOfStates = 200;

private int N = 0, row = 0;
private int col = 0;
private int[] queensPosition;
private int[,] queensWorld;

private int _goalIndex;
public int GoalIndex
{
get
{
return _goalIndex;
}
}


//Constructor = سازنده
public Queen(int n)
{
queensPosition = new int[n];
for (int i = 0; i < n; i++)
queensPosition[i] = -1;
queensWorld = new int[n, n];
N = n;
_goalIndex = 0;

}



//-------- Method -----------------------------------

public void GoalPosition(ref int[,] goalArray)
{
int i = 0;
do
{
row = queensPosition[col];
if (row >= 0)
ResetQueensWorld(row);
while (++row < N)
{
if (!Attack(row, col))
{
queensPosition[col] = row;
SetQueensWorld(row);
col++;
if (col == N)
{
col--;
for (i = 0; i < N; i++)
goalArray[_goalIndex, i] = queensPosition[i];
_goalIndex++;
ResetQueensWorld(row);
queensPosition[col] = -1;
col--;
}
break;
}
}
if (row == N)
{
queensPosition[col] = -1;
col--;
}
if (GoalIndex >= MaxOfStates)
break;
} while (col >= 0);

}

public bool Attack(int row, int column)
{
int value = 0;
value = queensWorld[row, column];
if (value == 0)
return false;
else
return true;
}

public void SetQueensWorld(int newRow)
{
int i, j, min;

//-------------- {-} ------------------
i = newRow;
j = 0;
while (j < N)
{
queensWorld[i, j] += col + 1;
j++;
}
//-------------- {|} ------------------
i = 0;
j = col;
while (i < N)
{
queensWorld[i, j] += col + 1;
i++;
}
//------------- {\} -------------------
min = newRow;
if (col < newRow)
min = col;
i = newRow - min;
j = col - min;
while (i < N && j < N)
{
queensWorld[i, j] += col + 1;
i++;
j++;
}
//----------- {/} ---------------------
min = newRow;
int eslash = N - col - 1;
if (eslash < min)
min = eslash;
i = newRow - min;
j = col + min;
while (i < N && j >= 0)
{
queensWorld[i, j] += col + 1;
i++;
j--;
}
}

public void ResetQueensWorld(int oldRow)
{
int i, j, min;

//-------------- {-} ------------------
i = oldRow;
j = 0;
while (j < N)
{
queensWorld[i, j] -= col + 1;
j++;
}
//-------------- {|} ------------------
i = 0;
j = col;
while (i < N)
{
queensWorld[i, j] -= col + 1;
i++;
}
//------------- {\} -------------------
min = oldRow;
if (col < oldRow)
min = col;
i = oldRow - min;
j = col - min;
while (i < N && j < N)
{
queensWorld[i, j] -= col + 1;
i++;
j++;
}
//---------------- {/} ----------------
min = oldRow;
int eslash = N - col - 1;
if (eslash < min)
min = eslash;
i = oldRow - min;
j = col + min;
while (i < N && j >= 0)
{
queensWorld[i, j] -= col + 1;
i++;
j--;
}
}
}
}