实现n皇后问题(回溯法)
2013-11-29 14:20
399 查看
/*======================================== 功能:实现n皇后问题,这里实现4皇后问题 算法:回溯法 ==========================================*/ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define NUM_QUEEN 4 /* 皇后个数 */ typedef int BOOL; void n_queen(int sol[], int n); BOOL place(int solution[], int k); void display(); int solution[NUM_QUEEN + 1] = {0}; /* 皇后问题的解向量 */ void main() { n_queen(solution, NUM_QUEEN); display(); } /*================================= 功能:找出满足n皇后问题的解向量 输入:皇后个数n 输出:n皇后的解向量sol[] ===================================*/ void n_queen(int sol[], int n) { int k = 1; /* 从第一个皇后开始 */ sol[k] = 0; while(k > 0) { sol[k] = sol[k] + 1; while(sol[k] <= n && !place(sol, k)) /* 如果sol[k]列不满足条件 找下一列 */ sol[k] = sol[k] + 1; if(sol[k] <= n) /* 找到满足条件的列 */ { if(k == n) break; /* 最后一个皇后处理完 直接退出 */ else k = k + 1; /* 处理下一个皇后 */ } else /* 判断完该行所有列 没有合适的位置 回溯 */ { sol[k] = 0; k = k - 1; } } } /*========================================================== 功能:判断第k个皇后的位置 是否正确 与前面k - 1个皇后比较 输入:前k - 1个解向量 输出:第k个位置是否正确 ============================================================*/ BOOL place(int sol[], int k) { int i; for(i = 1; i < k; i ++) { if(sol[i] == sol[k] || abs(sol[i] - sol[k]) == abs(i - k)) return FALSE; } return TRUE; } /*=========================== 功能:显示n皇后的解决向量 输入:无 输出:n皇后解决向量 =============================*/ void display() { int i = 1; printf("%d QUEES solution:", NUM_QUEEN); for(; i <= NUM_QUEEN; i ++) { printf("%d\t", solution[i]); } printf("\n"); }
相关文章推荐
- 数据库分区
- 某刷榜公司app刷榜收费表
- 平安银行笔面试
- Centos下安装配置samba
- PHP判断当前页面是电脑登录,还是手机登录
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
- Oracle “CONNECT BY” 使用
- 静态成员的使用
- 使用requestAnimationFrame实现平滑高效的javascript动画
- 更改jboss 6.0 Final的默认根应用或默认主页
- android 媒体软解码ffmpeg
- Android中监听ScrollView滑动停止和滑动到底部
- 资源分配问题(动态规划)
- canvas.translate(x,y)一点新的认识
- wine安装
- android 获得ImageView中Image的绘制大小
- SQLSERVER的自定义函数,不支持使用exec sp_executesql与Exec()
- Visual Studio 2008提高工作效率的小技巧
- 自定义简单的ant task
- Python正则匹配多行,多个数据