n皇后问题描述为:在一个nxn的棋盘上摆放n个皇后,要求任意两个皇后不能冲突,即任意两个皇后不在同一行、同一列或者同一斜线上。

1,1

1,2

1,3

1,4

2,1

2,2

2,3

2,4

3,1

3,2

3,3

3,4

4,1

4,2

4,3

4,4

上面是4皇后摆放方案,只有两种

寻找皇后摆放方案,可采用回溯法设计策略

算法的基本思想如下:

将第个皇后摆放在第行,从1开始,每个皇后都从第1列开始尝试。尝试时判断在该列摆放皇后是否与前面的皇后有冲突,如果没有冲突,则在该列摆放皇后,并考虑摆放下一个皇后;如果有冲突,则考虑下一列。如果该行没有合适的位置,回溯到上一个皇后,考虑在原来位置的下一个位置上继续尝试摆放皇后,直到找到所有合理摆放方案。

核心代码问题是:如何判断某行某列的位置是否有冲突,即是否有任意两个皇后在同一行、同一列或者同一斜线上

判断是否在同一列上非常好判断,列号相同即为在同一列

是否在同一行没必要判断,因为他是一行一行深度优先遍历的

判断是否处于同一右斜线,由下图可以总结规律两位置的行号加上列号相等,如1+4=2+3

判断是否处于同一左斜线,由下图可以总结规律两位置的行号减上列号相等,如2-1=3-2

queen[i]+i=queen[j]+j和queen[i]-i=queen[j]-j  ===>  queen[i]- queen[j]= j-i和queen[i]- queen[j]= -(j-i)  ====>  abs(queen[i]- queen[j]) = j-i

#include <stdio.h>#define N 4  //N代表皇后个数
int queen[N+1];  //表示皇后所在的位置,如queen[1]=2表示皇后在第一行第二列
int count = 0;void show(){printf("(");for (int i = 1; i <= N; i++){printf("%d ", queen[i]);}printf(")\n");
}int isQueen(int j){  //判断该列能否放置皇后,能放返回1,不能返回0int i;for (i = 1; i < j; i++){   //检查已经摆放好的皇后是否在同一列上或者在同一斜线上if(queen[i] == queen[j] || abs(queen[i]-queen[j]) == j-i){return 0;}}return 1;
}/*** @brief * * @param j 行数,递归时用到* i为列数*/
void Nqueen(int j){int i;for (i = 1; i <= N; i++)  //遍历行,即遍历所有方案,找出可行方案{queen[j] = i;if(isQueen(j)){  //判断该列能否放置皇后if(j == N){  //所有皇后拜访好了,输出摆放方案count ++;show();}else{Nqueen(j+1);  //递归,摆放下一个皇后}}}
}int main(void){Nqueen(1);printf("方案数:%d", count);return 0;
}

n皇后问题-c语言实现相关推荐

  1. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

  2. 2n皇后问题C语言实现

    试题 基础练习 2n皇后问题 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白 ...

  3. 八皇后问题c语言循环,八皇后问题的12组解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define N 8 /*皇后数*/ typedef int bool; rot(char d[ ],char s[ ...

  4. n皇后问题c语言_用栈解决N皇后问题(C语言)

    点击上方蓝字关注"程序员Bob"呀~ 孩子不是图画练习册,你不能随心所欲涂上你想要的颜色. --<追风筝的人> 问题描述:输入一个整数n,输出对应的n皇后问题的解的个数 ...

  5. 八皇后问题--C语言学习笔记

    在下面所示的棋盘中,皇后可以攻击位于箭头所覆盖的位置的所有棋子,那么现在有八个皇后,如何放置可以让他们之间不会相互攻击呢? 本文采用回溯法,先附上维基百科上对回溯法的解释: " 回溯法(英语 ...

  6. n皇后问题c语言_九章算法 | N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线). 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的 ...

  7. 88皇后问题C语言程序设计,八皇后问题--C语言程序设计.pdf

    八皇后问题 学 2012年 9 月 5 日 目录 一.选题 1.1背景知识---------------------------2 1.2设计目的与要求------------------------ ...

  8. n皇后问题c语言报告,关于N皇后问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很慢啊! #include #include /* Æå×ÓÊý¼°ÆåÅÌ´óСMAXxMAX */ #define MAX 15 int board ...

  9. 蓝桥杯Python-2n皇后问题(和别人的想法有点不一样)

    首先附上问题链接:蓝桥杯基础练习VIP-2n皇后问题 - C语言网 (dotcpp.com) 问题描述: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使 ...

  10. 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)

    广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...

最新文章

  1. 使用sublime text 执行 tcl 出错
  2. Beta 冲刺(6/7)
  3. Tomcat日志中文乱码问题解决
  4. oracle 多个实例互相切换实例
  5. Lync-技巧-2.启用-用户-启用-语音-设置-线路URI
  6. 蓝牙驱动卸载后自动安装_最热建筑安装工程计算表格,输入后自动生成,省时方便易上手...
  7. 02 unix文件系统和命令
  8. 多表查询, 聚集查询和分组查询
  9. ArcIMS9.2新增地图服务时check your map file's layers and data source connections解决
  10. visio 2003 问题
  11. 一款备受九零后喜爱的独特界面,VC++屏幕保镖(锁屏程序)附源码
  12. 数据库SQL Server 2017下载及安装
  13. 什么是二维条码与及特点
  14. 河北赛区|数学建模国赛河北赛区成绩发布
  15. 【Excel函数】隔行取数并取最大值
  16. 微服务和SpringCloud的关系
  17. ttf-dejavu fontconfig字体
  18. 如何裁剪视频画面尺寸?快把这些方法收好
  19. ESP8266+micropython+HCSR04 超声波测距传感器
  20. 大家来找茬辅助工具超级简易版

热门文章

  1. StretchDIBits绘制原始YUV异常
  2. 【博弈论】耶鲁大学公开课--博弈论Problem Set 1--Solution
  3. ​倒卖二手书,一个被忽略的项目,​做的​好月赚1w+
  4. 精简版WIN XP安装日文输入法
  5. 程序员python开发简历范文_程序员简历就该这样写
  6. chrome浏览器Flash版本过低解决方法
  7. 2:0战胜Dota2世界冠军OG,OpenAI发起全网挑战,不服来战!
  8. 启动Apache时提示缺少vcruntime140.dll怎么解
  9. android手机怎么用车载高德地图,用手机更新车载高德地图,汽车导航升级方法...
  10. python实现屏幕录制_python批量转换屏幕录像专家的exe视频