{
//col check
for (int r = 0; r < row; r++)
{
if (Queens[r, col])
{
return false;
}
}
for (int r = row + 1; r < this.Size; r++)
{
if (Queens[r, col])
{
return false;
}
}
//row check
for (int c = 0; c < col; c++)
{
if (Queens[row, c])
{
return false;
}
}
for (int c = col + 1; c < this.Size; c++)
{
if (Queens[row, c])
{
return false;
}
}
//slash check
for (int r = 0; r < row; r++)
{
int c = row + col - r;
if (c >= 0 && c < this.Size)
{
if (Queens[r, c])
{
return false;
}
}
}
for (int r = row + 1; r < this.Size; r++)
{
int c = row + col - r;
if (c >= 0 && c < this.Size)
{
if (Queens[r, c])
{
return false;
}
}
}
//back slash check
for (int r = 0; r < row; r++)
{
int c = r - row + col;
if (c >= 0 && c < this.Size)
{
if (Queens[r, c])
{
return false;
}
}
}
for (int r = row + 1; r < this.Size; r++)
{
int c = r - row + col;
if (c >= 0 && c < this.Size)
{
if (Queens[r, c])
{
return false;
}
}
}
return true;
}
private int FindRowinCol(int col)
{
int row = 0;
for (; row < this.Size; row++)
{
if (Queens[row, col])
{
return row;
}
}
return NotExist;
}
private bool Find()
{
int row = 0;
int col = 0;
Queens[row, col] = true;
col++;
while (true)
{
for ( ; row < this.Size; row++)
{
if (this.Check(row, col))
{
Queens[row, col] = true;
break;
}
}
row = FindRowinCol(col);
if (row == NotExist)
{
do
{
col--;
if (col < 0)
{
return false;
}
row = FindRowinCol(col);
Queens[row, col] = false;
row++;
} while (row >= this.Size);
}
else
{
col++;
row = 0;
if (col >= this.Size)
{
break;
}
}
}
return true;
}