算法-n皇后问题
来源:互联网 发布:95社区源码 编辑:程序博客网 时间:2024/05/16 16:00
题目描述:一个 n*n 的棋盘,要在上面放 n 个皇后。规则:两个皇后之间如果是同列、同行、同对角线它们会互相攻击。也就
是说:棋盘上的任意两个皇后不能为同列、同行、同对角线。
算法思想:q(j)表示一个解的空间即存储一组可行解的数组,j表示行数,q(j)的值表示j行可以放置皇后的所在列数,根据任意
两个皇后不能在同列、同对角线可得放置皇后的条件是
(1) q( i ) != q( k );
(2) abs( q( i ) - q( k ) ) != abs( i - k )。
当可以放置皇后时就继续到下一行,不能放置则尝试该行的下一列位置,重新检测,如此反复,直到将所有解解出。
#include <stdio.h>#include <math.h>#define N 15 //规定皇后最多为15个 int q[N]; //记录各皇后所在的列号int count = 0;int check(int i,int k){//检验第i行的k列上是否可以摆放皇后int j=1;while(j<i){ //j=1~i-1是已经放置了皇后的行//第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上if(q[j]==k || abs(j-i)==abs(q[j]-k)) return 0;j++;}return 1;}void print(int n){int i,j;printf("第%d个解:",count);for(i=1;i<=n;i++)printf("(%d,%d) ",i,q[i]);printf("\n");}void place(int i,int n) {//放置皇后到棋盘上 int j;if(i>n){++count;print(n);} else {for(j=1;j<=n;j++){ //试探第i行的每一个列if(check(i,j)){q[i] = j;place(i+1,n); //上一任务完成时才进行下一个任务}}}}int main(void){int n;scanf("%d",&n);if(n<=15)place(1,n);printf("%d\n",count);return 0;}
0 0
- N皇后问题算法
- N皇后问题算法
- 【算法】n皇后问题
- 算法-n皇后问题
- 算法 N皇后问题
- N皇后问题求解算法
- 回溯算法n皇后问题
- LasVegas算法 n皇后问题
- N皇后问题(算法)
- n-皇后问题 算法代码
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 目前最快的N皇后问题算法!!!
- 求 N 皇后问题回溯算法
- n皇后问题——回溯算法
- N皇后问题摆法算法描述
- QS2算法求解N-皇后问题
- 回溯算法之 N皇后问题
- 算法系列——N皇后问题
- listview中如果存在button imagebutton 等强焦点事件 处理方法
- javascript作用域与闭包
- mysql与excel数据互转小需求
- Angularjs中的标签模式和html5模式
- 开发 Spring 自定义视图和视图解析器
- 算法-n皇后问题
- Rollout学习1 简单使用篇
- CountDownLatch、CyclicBarrier和Semaphore用法
- 嵌入式人才的发展方向
- c++友元
- [转载]解读2014之前端篇:任性的颠覆式改变
- hdoj 1052经典贪心
- Android微信支付
- hbase1.0和0.94差别(client端)