一、N皇后问题的概念

n 皇后问题,研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 一个皇后可以向水平、垂直以及向斜对角方向移动,如果一个皇后出现在另一个皇后的同一行,同一列或者斜对角,那它就可以被这个皇后攻击。可以通过列举出在棋盘上所有的情况,然后判断每个组合是不是符合的条件。

二、代码步骤

1、对皇后位置对错的判断

2、递归实现N皇后位置的排列

3、定义N皇后的指针并初始化

4、代码入口

5、运行结果


三、代码功能

1、对皇后位置对错的判断

bool place(int* paraSolution, int paraT)
{int j;for(j = 1;j < paraT;j++){if(abs(paraT-j) == abs(paraSolution[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])return 0; }return 1;

2、递归实现N皇后位置的排列

void backtracking(int* paraSolution,int paraN,int paraT)
{int i;if(paraT > paraN){for(i = 1; i <= paraN; i++){printf("%d ",paraSolution[i]);//打印出每种符合条件的情况}printf("\r\n");}else{for(i = 1;i <= paraN; i++){paraSolution[paraT] = i;if(place(paraSolution,paraT)){backtracking(paraSolution,paraN,paraT+1);}}}
}

3、定义N皇后的指针并初始化

void nQueen(int paraN)
{int i;int* solution = (int*)malloc((paraN + 1) * sizeof(int));for(i = 0;i <= paraN; i++){solution[i] = 0;}backtracking(solution, paraN ,1);
}

4、代码入口

int main()
{nQueen(5);return 1;
}

5、运行结果

1 3 5 2 4
1 4 2 5 3
2 4 1 3 5
2 5 3 1 4
3 1 4 2 5
3 5 2 4 1
4 1 3 5 2
4 2 5 3 1
5 2 4 1 3
5 3 1 4 2

四、整体代码

#include <stdio.h>
#include <malloc.h>
#include <math.h>bool place(int* paraSolution, int paraT)
{int j;for(j = 1;j < paraT;j++){if(abs(paraT-j) == abs(paraSolution[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])return 0; }return 1;
}void backtracking(int* paraSolution,int paraN,int paraT)
{int i;if(paraT > paraN){for(i = 1; i <= paraN; i++){printf("%d ",paraSolution[i]);}printf("\r\n");}else{for(i = 1;i <= paraN; i++){paraSolution[paraT] = i;if(place(paraSolution,paraT)){backtracking(paraSolution,paraN,paraT+1);}}}
}void nQueen(int paraN)
{int i;int* solution = (int*)malloc((paraN + 1) * sizeof(int));for(i = 0;i <= paraN; i++){solution[i] = 0;}backtracking(solution, paraN ,1);
}int main()
{nQueen(5);return 1;
}

数据结构之N皇后问题(C语言)相关推荐

  1. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  2. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  3. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  4. 数据结构源码笔记(C语言):快速排序

    //实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  5. 数据结构源码笔记(C语言):冒泡排序

    //冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  6. 数据结构源码笔记(C语言):希尔插入排序

    //实现希尔插入排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; ty ...

  7. 数据结构源码笔记(C语言):直接插入排序

    //实现直接插入排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

  8. 数据结构源码笔记(C语言):直接选择排序

    //实现直接选择排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

  9. 数据结构源码笔记(C语言):置换-选择算法

    //实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...

  10. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

最新文章

  1. 年薪 50w,这门编程语言该怎么学?
  2. 让IE6、IE7、IE8支持CSS3的圆角、阴影样式
  3. 最大公因数、最小公倍数、因式分解
  4. Spark-shell和Spark-hive的使用
  5. 正则表达式从入门到实战
  6. 列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
  7. flask v0.1 路由
  8. myeclipse ctrl + 鼠标单击 出现 source not found
  9. 学习python第一天总纲
  10. mysql提高运行效率_提升Mysql执行效率的SQL优化技巧汇总
  11. python打印购物清单_实例9:用Python自动生成Excel档每日出货清单
  12. drupal主题_50个精心挑选的美丽Drupal 6个主题
  13. java批量图片下载+打包成zip格式
  14. 若依前后端分离项目图片上传后访问404问题
  15. [原创]自定义公历农历日期选择器
  16. 设计公司怎样合理税收筹划,可以享受哪些税收政策?
  17. 微信公众号文章爬取 java
  18. (DP)codeforces - 710E Generate a String
  19. sql——字符串处理
  20. 8月30日科技联播:子弹短信总激活用户超过400万,亚马逊将成第2个万亿美元市值企业...

热门文章

  1. 三本全国计算机考研难度,三本大学的学生考211的研究生很难吗?
  2. android开发apk在qq发送无法正常安装的问题
  3. 【编译原理】学习笔记1 词法分析
  4. C++ 多线程: WaitForSingleObject(m_hEvent,INFINITE) ;
  5. 什么是.ink 域名?.ink 域名有什么价值优势?
  6. 计算机公开课教学反思,《让我们荡起双桨》公开课教学反思
  7. 批量获取微信公众号文章里的图片
  8. i2c设备驱动(ds1337实例:内核代码)
  9. 1.1 Linux发展史、内核版本和发行版本
  10. 简述thinkphp自带队列think-queue的使用以及通过supervisor实现常驻进程