N皇后问题:
在nN的棋盘上放置彼此不受攻击的n个皇后。
皇后可以攻击与之处在同一列或同一行或同一斜线上的棋子。n皇后的问题等价于在nn格的棋盘上放置n个皇后,任何两个皇后不放在同一行或同一列或同一斜线。
//编程要求:找出一个n*n格棋盘上放置n个皇后并使其不能互相攻击
由于棋盘的每列只有一个皇后,所以可以用一维向量X(x1,x2,…xn),其中xi{1,2,…,n},表示第i列皇后所在的行x[i],即解空间的每个节点都有n个儿子,因此解空间的大小为n的n次方、
这是一颗子集树。
#define
int n, //棋盘的大小
int x[NUM]; //解向量
int sum; //当前已经找到的可行方案
//形参t是回溯的深度,从1开始
void Backtrack(int t)
{
int i;
//到达叶子节点,获得一个可行方案,累计总数,并输出该方案
if(t>n)
{
sum++; //是全局变量
for(i=1;i<n;i++)
prinf("%d",x[i]);
printf("\n");
}
else
for(i=1;i<n;i++) //把皇后放在1-n的任意一个位置
{
x[t]=i; //记下改位置
if(Place(t)Backtrack(t+1)); //判断是否可行
}
}
//约束函数
inline bool Place(int t)
{
int i;
for(i=1;i<t;i++) //判断同一行
if((abs(t-i)==abs(x[i]-x[t]))||(x[i]==x[t]))
return false;
return true;
}