【经典算法】八皇后问题
2009-09-07 11:05
218 查看
经典的N皇后问题,利用回溯和递归的思想解决这个问题。
非递归算法
#include<stdio.h> #include<stdlib.h> int *x; int n; int sum=0; void Queen(); void Traceback(int r); int Place(r); void output(); int main() { scanf("%d",&n); x=(int *)malloc(sizeof(int)*n); Queen(); return 0; } void Queen() { Traceback(0); return; } void Traceback(int r) { int i; if(r>=n) { sum++; output(); } else { for(i=0;i<n;i++) { x[r]=i; if(Place(r)) Traceback(r+1); } } return ; } int Place(r) { int i; for(i=0;i<r;i++) { if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i])) return 0; } return 1; } void output() { int i,j; printf("the number is:%d/n",sum); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(x[i]==j) printf("*"); else printf("#"); } printf("/n"); } return ; }
非递归算法
#include "stdio.h" #include "stdlib.h" #include "time.h" /**//* 记录当前的放置方案 */ int *x; /**//* 皇后的个数N 和 方案数目 */ int n,sum=0; /**//* 检查参数所指示的这一行皇后放置方案是否满足要求 */ int Place(int); /**//* 非递归的方法求取皇后放置方案 */ void Queen2(void); /**//* 打印当前成功的放置方案 */ void PrintMethod(void); void main(void) { long start,stop; printf("input n: "); scanf("%d",&n); x=(int *)malloc(sizeof(int)*n); time(&start);/**//*记录开始时间*/ Queen2(); time(&stop);/**//*记录结束时间*/ printf("/nmethod total %d /n",sum); printf("/nuse %d seconds /n",(int)(stop-start)); } int Place(int r) { int i; for(i=0;i<r;i++){ if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i])) return 0; } return 1; } void Queen2(void) { int i,k; for(i=0;i<n;i++) x[i]=0; k=0; while(1){ if(x[k]>=n){ /**//* 如果当前第K行的放置位置超出了范围,那么检查该行是否为第0行 如果是第0行,说明所有的方案都已经遍历完毕,函数返回;否则回退到前一行 */ if(k==0) break; x[k]=0; /**//* 下次遍历的初始位置 */ k--; /**//* 返回上一行 */ x[k]++; /**//*下一种放置方案*/ } else if(!Place(k)){ /**//* 如果当前第K行的放置方案不满足要求,采取下一种放置方案*/ x[k]++; } else{ if(k==(n-1)){ /**//* 如果已经是最后一行,那么表示已经成功得到一种放置方案*/ sum++; /**//* PrintMethod(); */ x[k]=0; /**//*下次遍历的初始位置*/ k--; /**//*返回上一行*/ x[k]++; /**//*下一种放置方案*/ }else k++; /**//* 否则开始配置下一行的皇后 */ } } } void PrintMethod(void) { int i,j; printf("/nmethod %d/n",sum); for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(j==x[i]) printf("*"); else printf("#"); } printf("/n"); } }
相关文章推荐
- 八皇后问题(参考算法竞赛入门经典)
- C++中垃圾回收机制中几种经典的垃圾回收算法
- 经典算法—快速排序(Quicksort)使用详解
- 2015校招经典算法笔试题
- c语言经典算法—求0—7 所能组成的奇数个数
- 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇
- 算法竞赛入门经典 习题笔记
- 经典算法(2)——0/1背包问题(动态规划法)(ZZ)
- 机器学习十大经典算法
- 数据挖掘经典算法--priori算法
- LeetCode | 52. N-Queens II 经典算法n后问题回溯法
- 经典数据结构与算法之循环单链表
- 白话经典算法系列之一 冒泡排序的三种实现
- 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇
- 白话经典算法系列之一 冒泡排序的三种实现
- 8、人脸识别经典算法一:特征脸方法(Eigenface)
- <五大经典算法> 四、回溯法
- 算法竞赛入门经典第四章习题4-1 Xiangqi UVA - 1589
- java经典算法40题
- 100个经典算法