8皇后问题是高斯提出来的一个问题,在一个8*8棋盘上,8个棋子不在同一行同一列,和同一个对角线上的摆放方式有几种,我们一般才有回溯加剪枝的方法求解。回溯剪枝法也是很多公司笔试题中简单题经常考的。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
int arry[8][8]; //打印数组用的
int t = 0; //计算总共次数
void search_answer(unsigned char flag[],int n)
{
if(n == 8)
{
for(int i = 0; i < n; i++)
{
arry[i][flag[i]] = 1;
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%d ",arry[i][j]);
printf("\n");
}
printf("\n\n");
memset(arry,0,sizeof(arry));
t++;
}
else
{
for(int i = 0; i < 8; i++)
{
if(n == 0)
{
flag[n] = i;
search_answer(flag,n+1);
}
else
{
unsigned char ok = 1;
for(int j = 0; j < n; j++)
{
if(flag[j] == i || n-j == abs(i-flag[j])) //不符合条件的剪枝
{
ok = 0;
break;
}
}
if(ok)
{
flag[n] = i;
search_answer(flag,n+1);
}
}
}
}
}
int main()
{
unsigned char flag[8]; //代表每行的皇后处于第几列,i代表第行,flag[i]代表第i列
memset(flag,0,sizeof(flag));
search_answer(flag,0); //从第0行开始查找
printf("%d\n",t);
return 0;
}