问题描述:
在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。
class Program
{
static int N = 8;
static int[] index = new int[N];
static int solution = 0;
static void Main(string[] args)
{
for (int i = 0; i < N; i++)
index[i] = 0;
//Test8Huanghou();
//Test8Huanghou2();
//默认列索引0开始
Test8Huanghou3(0);
Console.ReadLine();
}
//参数为列的索引,从0开始
private static void Test8Huanghou3(int col)
{
//选定一列后,循环这一列的每一行
for( int i = 0;i < N;i++)
{
if( col == N)
{
if( solution > 2)
{
return;
}
solution++;
Console.WriteLine("-solution:" + solution);
PrintMap();
return;
}
//假定将一个皇后放到col列的i行
index[col] = i;//注意此处,数组的索引是列索引,数组索引对应值是这一列的第几行放置了皇后(同时注意索引从0开始)
//检测当前放置的是否可以放
if(CheckCanSet(col))
{
//如果可以放置,则开始进行下一列的放置
Test8Huanghou3(col + 1);
}
}
}
//检测某个位置是否可放置
private static bool CheckCanSet(int col)
{
//根据传递进来的列,我们从左往右进行检测,从0到(col-1)依次检测
for( int i = 0;i < col;i++)
{
//如果是同一行,返回false
if( index[i] == index[col])
{
return false;
}
//是否存在斜线上的元素,返回false,这里用到了斜率
if( Math.Abs(index[col] - index[i]) == Math.Abs(col - i))
{
return false;
}
}
return true;
}
private static void PrintMap()
{
for( int i = 0;i< N;i++)
{
//+1输出是为了看着清晰
Console.Write("(" + (i+1) + "," + (index[i] + 1) + ")");
Console.WriteLine("=====");
}
}
}