/*高斯在1850年提出:在8X8格的棋盘上摆放八个皇后
*使其不能互相攻击,即任意两个皇后都不能处于同一
*行、同一列或同一斜线上,问:共有多少种摆法。
*/
//全局变量
#include <stdio.h>
#include <math.h>
int a[9] = {100};
int count = 0;
//判断第i行第value列放值是否正确
int Place(int i, int value)
{
int j;
if(i == 1) //第一行先放,所以肯定不会有冲突位置,放哪都合适
return 1; //直接去告诉长官你找到位置站好了,让他去安排下一行吧
for(j = 1; j < i; j++){
if(a[j] == value) //循环检测当前行第value列在之前是否在之前有皇后上位过
return 0;
if(abs(i - j) == abs(value - a[j])) /*还要预防斜线上也有皇后在埋伏你。
*abs()函数是求绝对值的,但是在这可以
*用来判断value是否等于以j为基点延出两
*条对角线至本行相交于两点的值,即value
*在不在皇后对应点的斜线上.
*/
return 0;
}
return 1;
}
//显示结果
void ShowResult()
{
int i, j;
for(j = 1; j <= 8; j++){
for(i = 1; i < a[j]; i++){
printf("* ");
}
//打印每一行中皇后的位置a[j]
printf("Q");
for(i = i+1; i <= 8; i++){
printf("* ");
}
putchar(10);
}
}
//进行递归回溯
void Backtrack(int t)
{
int i;
//找出一次解,打印图案一次
if(t > 8){
puts("******************************\n");
ShowResult();
count++;
return;
}
else{
for(i = 1; i <= 8; i++){
if(Place(t, i)) //循环判断当前第t行的第i列位置是否合适
{
a[t] = i; //在当前行找到合适位置后a[行数] = 列数
Backtrack(t + 1); //继续递归找下一行皇后合适的位置
}
}
}
}
//输出八皇后问题解的个数
void ShowCount()
{
printf("八皇后问题共有%d个解!\n", count);
}
//主函数
void main()
{
Backtrack(1);
ShowCount();
}
*使其不能互相攻击,即任意两个皇后都不能处于同一
*行、同一列或同一斜线上,问:共有多少种摆法。
*/
//全局变量
#include <stdio.h>
#include <math.h>
int a[9] = {100};
int count = 0;
//判断第i行第value列放值是否正确
int Place(int i, int value)
{
int j;
if(i == 1) //第一行先放,所以肯定不会有冲突位置,放哪都合适
return 1; //直接去告诉长官你找到位置站好了,让他去安排下一行吧
for(j = 1; j < i; j++){
if(a[j] == value) //循环检测当前行第value列在之前是否在之前有皇后上位过
return 0;
if(abs(i - j) == abs(value - a[j])) /*还要预防斜线上也有皇后在埋伏你。
*abs()函数是求绝对值的,但是在这可以
*用来判断value是否等于以j为基点延出两
*条对角线至本行相交于两点的值,即value
*在不在皇后对应点的斜线上.
*/
return 0;
}
return 1;
}
//显示结果
void ShowResult()
{
int i, j;
for(j = 1; j <= 8; j++){
for(i = 1; i < a[j]; i++){
printf("* ");
}
//打印每一行中皇后的位置a[j]
printf("Q");
for(i = i+1; i <= 8; i++){
printf("* ");
}
putchar(10);
}
}
//进行递归回溯
void Backtrack(int t)
{
int i;
//找出一次解,打印图案一次
if(t > 8){
puts("******************************\n");
ShowResult();
count++;
return;
}
else{
for(i = 1; i <= 8; i++){
if(Place(t, i)) //循环判断当前第t行的第i列位置是否合适
{
a[t] = i; //在当前行找到合适位置后a[行数] = 列数
Backtrack(t + 1); //继续递归找下一行皇后合适的位置
}
}
}
}
//输出八皇后问题解的个数
void ShowCount()
{
printf("八皇后问题共有%d个解!\n", count);
}
//主函数
void main()
{
Backtrack(1);
ShowCount();
}