//八皇后问题:在8×8的国际象棋棋盘上,安放8个皇后,
//要求没有一个皇后能够“吃掉”任何其他一个皇后,
//即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或同一对角线。
#include <stdio.h>
int M[8];//依次存放八个皇后的列号,从0开始,即M[i]=j表示i行j列摆一个皇后
//检查第j个皇后是否符合要求
int check(int j)
{ int i;
for(i=0;i<j;++i)
{ if(M[j]==M[i]) return false;//同列’|’
if((j-i)==(M[j]-M[i])) return false;//斜线’/’
if((j-i)==(M[i]-M[j])) return false;//斜线’/’
}
return true;
};
//显示结果
int t=0;//第t个解法
void show()
{ printf(“/n第%02d种摆法:”,++t);
for(int i=0;i<8;++i)
printf(“%d “,M[i]);
};
void queen(int n)
{ int i;
if(8==n)
{ show();
return;
}else
{ for(i=0;i<8;i++)
{ M[n]=i;
if(check(n))
queen(n+1); //递归
}
}
};
//递归求解
void test1()
{ queen(0);
};
//回溯求解
void test2()
{ int i,j;
for(i=0;i<8;++i)//i行
{ for(j=0;j<8;++j)//j列
{ M[i]=j;
back:
if(check(i)) break;
}
if(j<8) continue;//i行j列摆一个皇后
do
{
next:
–i;//行回溯
if(i<0) return;//完成
j=++M[i];
}while(j>=8);
goto back;//列回溯
}
show();
goto next;
};
int main()
{test1();
//test2();
return true;
}