n皇后问题-c语言实现
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语言实现相关推荐
- C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法
偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...
- 2n皇后问题C语言实现
试题 基础练习 2n皇后问题 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白 ...
- 八皇后问题c语言循环,八皇后问题的12组解
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define N 8 /*皇后数*/ typedef int bool; rot(char d[ ],char s[ ...
- n皇后问题c语言_用栈解决N皇后问题(C语言)
点击上方蓝字关注"程序员Bob"呀~ 孩子不是图画练习册,你不能随心所欲涂上你想要的颜色. --<追风筝的人> 问题描述:输入一个整数n,输出对应的n皇后问题的解的个数 ...
- 八皇后问题--C语言学习笔记
在下面所示的棋盘中,皇后可以攻击位于箭头所覆盖的位置的所有棋子,那么现在有八个皇后,如何放置可以让他们之间不会相互攻击呢? 本文采用回溯法,先附上维基百科上对回溯法的解释: " 回溯法(英语 ...
- n皇后问题c语言_九章算法 | N皇后问题
n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线). 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的 ...
- 88皇后问题C语言程序设计,八皇后问题--C语言程序设计.pdf
八皇后问题 学 2012年 9 月 5 日 目录 一.选题 1.1背景知识---------------------------2 1.2设计目的与要求------------------------ ...
- n皇后问题c语言报告,关于N皇后问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很慢啊! #include #include /* Æå×ÓÊý¼°ÆåÅÌ´óСMAXxMAX */ #define MAX 15 int board ...
- 蓝桥杯Python-2n皇后问题(和别人的想法有点不一样)
首先附上问题链接:蓝桥杯基础练习VIP-2n皇后问题 - C语言网 (dotcpp.com) 问题描述: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使 ...
- 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)
广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...
最新文章
- 使用sublime text 执行 tcl 出错
- Beta 冲刺(6/7)
- Tomcat日志中文乱码问题解决
- oracle 多个实例互相切换实例
- Lync-技巧-2.启用-用户-启用-语音-设置-线路URI
- 蓝牙驱动卸载后自动安装_最热建筑安装工程计算表格,输入后自动生成,省时方便易上手...
- 02 unix文件系统和命令
- 多表查询, 聚集查询和分组查询
- ArcIMS9.2新增地图服务时check your map file's layers and data source connections解决
- visio 2003 问题
- 一款备受九零后喜爱的独特界面,VC++屏幕保镖(锁屏程序)附源码
- 数据库SQL Server 2017下载及安装
- 什么是二维条码与及特点
- 河北赛区|数学建模国赛河北赛区成绩发布
- 【Excel函数】隔行取数并取最大值
- 微服务和SpringCloud的关系
- ttf-dejavu fontconfig字体
- 如何裁剪视频画面尺寸?快把这些方法收好
- ESP8266+micropython+HCSR04 超声波测距传感器
- 大家来找茬辅助工具超级简易版
热门文章
- StretchDIBits绘制原始YUV异常
- 【博弈论】耶鲁大学公开课--博弈论Problem Set 1--Solution
- ​倒卖二手书,一个被忽略的项目,​做的​好月赚1w+
- 精简版WIN XP安装日文输入法
- 程序员python开发简历范文_程序员简历就该这样写
- chrome浏览器Flash版本过低解决方法
- 2:0战胜Dota2世界冠军OG,OpenAI发起全网挑战,不服来战!
- 启动Apache时提示缺少vcruntime140.dll怎么解
- android手机怎么用车载高德地图,用手机更新车载高德地图,汽车导航升级方法...
- python实现屏幕录制_python批量转换屏幕录像专家的exe视频