在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
public List<int> position = new List<int>();//存储八皇后的位置 1,2,3,4,5,6,7,8
public int count = 0;
protected void Page_Load(object sender, EventArgs e)
{
//初始化第一个皇后的位置
for (int i = 1; i <=8; i++)
{
position = new List<int>();
position.Add(i);//加入第一个皇后的位置
func(1);//从第二行开始分配位置
}
}
public void func(int n)
{
//每行有8列
for (int i = 1; i <= 8; i++)
{
bool isExist = false;
//这句很重要,需将当前列索引以后的数据全部清除,回溯的时候有用
if(position.Count> n)
{
position.RemoveRange(n, position.Count - n );
}
for (int k = 0; k < position.Count; k++)
{
bool a = true;//没有同一行同一列同一斜线上的数据
for (int j = 0; j < position.Count; j++)
{
//不能处于同一行、同一列或同一斜线上,同一行同一列的特征是位置相等,同一斜线上的特征是两个数的差等于所在行的差
if (Math.Abs(position[j] - i) == n - j||position[j]==i)
{
//如果有在同一行同一列同一斜线上
a = false;
}
}
if (a == true)
{
isExist = true;
break;
}
}
if (isExist == true)
{
position.Add(i);
//当找到一组数据后输出
if (n == 7)
{
StringBuilder sb = new StringBuilder();
for (int k = 0; k < position.Count; k++)
{
sb.Append(position[k].ToString() + "|");
}
Response.Write(sb.ToString() + "<br>");
}
else
{
//找下一行符合条件的位置
func(n + 1);
}
}
}
}
ps:我算的是92种 ,第一次写博客,请大家轻点拍砖。