/*========================================
功能:实现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 + ] = {}; /* 皇后问题的解向量 */ void main()
{
n_queen(solution, NUM_QUEEN);
display();
}
/*=================================
功能:找出满足n皇后问题的解向量
输入:皇后个数n
输出:n皇后的解向量sol[]
===================================*/
void n_queen(int sol[], int n)
{
int k = ; /* 从第一个皇后开始 */
sol[k] = ;
while(k > )
{
sol[k] = sol[k] + ;
while(sol[k] <= n && !place(sol, k)) /* 如果sol[k]列不满足条件 找下一列 */
sol[k] = sol[k] + ;
if(sol[k] <= n) /* 找到满足条件的列 */
{
if(k == n)
break; /* 最后一个皇后处理完 直接退出 */
else
k = k + ; /* 处理下一个皇后 */
}
else /* 判断完该行所有列 没有合适的位置 回溯 */
{
sol[k] = ;
k = k - ;
}
}
}
/*==========================================================
功能:判断第k个皇后的位置 是否正确 与前面k - 1个皇后比较
输入:前k - 1个解向量
输出:第k个位置是否正确
============================================================*/
BOOL place(int sol[], int k)
{
int i; for(i = ; 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 = ;
printf("%d QUEES solution:", NUM_QUEEN);
for(; i <= NUM_QUEEN; i ++)
{
printf("%d\t", solution[i]);
}
printf("\n");
}

最新文章

  1. eap-tls
  2. webForm中的验证控件
  3. Squid configuration directives 3.0
  4. C++字符转码
  5. Android Studio配置和使用OpenCV3.x,不需要OpencvManager
  6. Android拍照保存在系统相册不显示的问题
  7. sql server中备份数据的几种方式
  8. Android SeekBar 和 draw9patch 的使用
  9. bootstrap绿色大气后台模板下载[转]
  10. poj3233(矩阵快速幂)
  11. linux下shell命令trap
  12. Bootstrap入门(十五)组件9:面板组件
  13. Android LayoutInflator 解析
  14. 在使用mysql8.0的时候遇到的密码链接问题
  15. Git安装配置和提交本地代码至Github,修改GitHub上显示的项目语言
  16. 分布式 NewSQL 对比
  17. 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)
  18. html (第四本书第四章参考)
  19. 第一个map reduce程序
  20. windows聚焦图片文件重命名bash脚本

热门文章

  1. Java基础知识强化之多线程笔记04:并行和并发 区别
  2. Android_Intent_passValue(4)
  3. 对比AppScan Source和Fortify扫描AltoroJ的结果
  4. Unicode 编码解码
  5. mapping 详解3(Meta-Fields)
  6. nyoj 96 n-1位数(处理前导 0 的情况)
  7. JavaScript高级程序设计(第三版)学习笔记8、9、10章
  8. dagger和butterknife使用冲突
  9. Masonry 控件详解
  10. mysql innodb 数据打捞(一)innodb 页面结构特征