八皇后问题:在8×8格的国际象棋上摆放八个皇后,任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。


将棋盘抽象为4 * 4到20 * 20大小的矩阵

输入样例:

请输入棋盘的大小(4 ~ 20):
4

输出样例:

Solution: 1
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0Solution: 2
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0

输入样例2:

请输入棋盘的大小(4 ~ 20):
8

输出样例2(部分)(共92种):

Solution: 91
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0Solution: 92
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0

代码如下:

#include <stdio.h>
#include <stdlib.h>#define MAX 20//棋盘大小为小于等于 20 * 20
//定义八皇后结构体
typedef struct queen {int N;//棋盘大小int matrix[MAX][MAX];//棋盘矩阵int row[MAX];//每行皇后摆放的列号int count;//解决方案}Queen;//初始化问题
void _initProblem(Queen *pQueen,int n);
//试探第i行皇后摆放
void _try(Queen *pQueen, int i);
//检查目前第i个皇后摆放是否正确
int _check(Queen *pqueen,int i);
//打印一个解
void _printSolution(Queen *pQueen);
int main()
{int n;//储存棋盘大小//进行循环求解while(1) {printf("请输入棋盘的大小(4 ~ 20):\n");scanf("%d",&n);if(n < 4 || n > 20) {printf("不符合棋盘规则,请重新输入\n");continue;}//创建根节点Queen problem;//初始化棋盘_initProblem(&problem,n);//进行摆放_try(&problem,1);}return 0;
}
//_initProblem
void _initProblem(Queen *pQueen, int n) {pQueen -> N = n;pQueen -> count = 0;//将所有棋盘都初始化为0int i,j;for(i = 0; i < n; i++) {for(j = 0; j < n;j++) {pQueen -> matrix[i][j] = 0;}}
}
//_try
void _try(Queen *pQueen, int i) {//如果已获得一组解(大于棋盘)if(i > pQueen -> N) {++(pQueen -> count);_printSolution(pQueen);return;//继续回溯}//试探摆放int j;for(j = 1; j <= pQueen -> N; j++) {//摆放皇后pQueen -> matrix[i-1][j-1] = 1;//记录列数pQueen -> row[i-1] = j;//试探第i行的皇后if(_check(pQueen,i)) {//进行第i+1行皇后的试探_try(pQueen,i+1);}//试探失败回溯pQueen -> matrix[i-1][j-1] = 0;//恢复状态}
}
//_check
int _check(Queen *pqueen,int i) {int rowNow;//记录此时第i行皇后的列数rowNow = pqueen -> row[i-1];int j;//行数//进行排查for(j = 1;j < i; j++) {//列数相同失败if(pqueen -> row[j-1] == rowNow)return 0;//原皇后在左上角失败if(pqueen -> row[j-1] == rowNow - (i - j))return 0;//原皇后在右上角失败if(pqueen -> row[j-1] == rowNow + (i - j))return 0;}//试探成功返回1return 1;
}
//_printSolution
void _printSolution(Queen *pqueen) {int i,j;printf("Solution: %d\n",pqueen -> count);for(i = 0; i < pqueen -> N; i++) {for(j = 0; j < pqueen -> N; j++) {//被标记打印1if(pqueen -> matrix[i][j] == 1) {printf("1 ");}//未被标记打印0else{printf("0 ");}}printf("\n");}printf("\n");
}

[C语言]八皇后问题回溯算法相关推荐

  1. c语言八皇后问题经典算法,经典算法之八皇后问题

    八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例.今天我们就一起来探究一下吧! 时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题, 在8×8格的国际象棋上摆放八个 ...

  2. java递归-八皇后问题(回溯算法)

    1.八皇后问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任 ...

  3. Bailian2754 八皇后【回溯】

    2754:八皇后 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格) ...

  4. n皇后问题python_N皇后问题—回溯算法经典例题

    N 皇后是回溯算法经典问题之一.问题如下:请在一个 ni n 的正方形盘面上布置 n 名皇后,因为每一名皇后都可以自上下左右斜方向攻击,所以需保证每一行.每一列和每一条斜线上都只有一名皇后. 最简单的 ...

  5. Bailian2698 八皇后【回溯】

    2698:八皇后问题 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出所有 ...

  6. [Leetcode][第81题][JAVA][N皇后问题][回溯算法]

    [问题描述][困难] [解答思路] 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import j ...

  7. 八皇后java_八皇后(JAVA算法实现)

    在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝 ...

  8. leetcode面试题 08.12. 八皇后(回溯)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

  9. c语言八数码A星算法代码解析,八数码问题c语言a星算法详细实验报告含代码解析...

    八数码问题c语言a星算法详细实验报告含代码解析 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 一.实验内容和要求 八数码问题:在3 ...

最新文章

  1. 台大林轩田《机器学习基石》系列课程教材的习题更新完毕了
  2. Go 中string和int类型相互转换
  3. import win32com.client在python中报错及其解决办法
  4. 互联网晚报 | 9月13日 星期一 | 美赞臣中国易主春华资本;美团外卖首次公开骑手配送时间算法;北京教培行业开展同业互助...
  5. 设计灵感|简约复古风格海报设计这样玩
  6. as 从java_从Java调用AS400 RPG
  7. Colidity-- Dominator
  8. 在英文Win7操作系统上部署C#开发的Web系统出现乱码的解决方法
  9. saltstack的探索-安装vim、nginx服务和配置、自定义脚本
  10. 《Web漏洞防护》读书笔记——第7章,访问控制防护
  11. 我的小米云端账号服务器,#小米开放云#免费云服务器安装Windows系统
  12. UE5 C++教程(三、多人游戏网络基础)
  13. 标志寄存器(PSW)
  14. WiFi偏门协议(四):增强的传输机制802.11aa
  15. 阿里云部署视频点播:学习文档使用Java程序部署视频点播基础用法之入门
  16. c语言数组文曲星猜数游戏编程,关于文曲星上猜数字游戏的c编程方法
  17. 单机征途mysql步骤不对_征途单机版架设中场景服务器启动失败?这是为什么? 你怎么解决的啊?告诉我 谢谢...
  18. Excel设置自动恢复功能以及数据恢复教程
  19. java gzip 压缩解压工具类
  20. Vue代理解决生产环境跨域问题

热门文章

  1. 使用百度云推送实现推送功能详解
  2. 一个java的小型WEB项目一个页面(IDEA + 前后端代码)--一些基本配置 分为三篇(第1篇)
  3. 基于Java毕业设计传统文化知识竞赛系统源码+系统+mysql+lw文档+部署软件
  4. python什么时候热门_Python小白需要知道的 20 个骚操作!
  5. nodejs中forEach和普通循环区别
  6. jenkins构建项目配置及推送阿里云镜像仓库
  7. 苹果一季度国内营收超130亿美元,万元iphoneX怎么成了国人最爱?
  8. 算法函数 Ins_Linklist() ;Del_Linklist(L,i);详细解释
  9. Java 常用工具类(9) : 图片上传至阿里云OSS
  10. kaggle aptos2019 的图像预处理