八皇后问题--递归调用

来源:互联网 发布:软件设计师怎么挂靠 编辑:程序博客网 时间:2024/06/08 05:55

参考了算法竞赛入门经典那本书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 ");elseprintf("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;}


0 0
原创粉丝点击