参考了算法竞赛入门经典那本书p125:
#include <stdio.h>
const int n=4;
int tol=0;
int arr[n];
//输出某个解
void print_res(int arr[],int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(arr[i]==j)
printf("Q ");
else
printf("O ");
}
printf("\n");
}
}
//递归求解所有解
//输入:cur-----代表当前处理的行号(从0开始计数,所以判断位置的时候已经保证了肯定不在同一行上)
void search_queen(int cur)
{
if(cur==n)
{
tol++;
//打印结果--必须在每次得到解后打印出来,否则后面的时候arr[]数组里边的内容就被覆盖了
/*for (int t=0; t<n; t++)
{
printf("%d ",arr[t]);
}
printf("\n");*/
printf("tol: %d\n",tol);
print_res(arr,n);
printf("\n");
return ;
}
else
{
for(int j=0; j<n; j++)//遍历每一列的位置,选择合适的位置
{
int ok=1;
arr[cur]=j;//试探第cur行的第j列的位置
for (int m=0; m<cur; m++)//判断是否符合位置条件
{
if(arr[m]==j || m-cur==arr[m]-j || m-cur==j-arr[m])//是否同一列、是否同一个对角线、是否同一个副对角线
{
ok=0;
break;//发现不符合条件,直接回溯,到cur行的下一个列的位置进行试探
}
}
if(ok==1)
search_queen(cur+1);//对下一行进行递归调用
}
}
}
int main()
{
search_queen(0);
return 0;
}