C语言经典面试题---八皇后问题
2018-03-13 17:35
453 查看
问题:1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?思路:使用递归回溯的方法解决,所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法(事实证明共有92中摆放方法)代码:#include<stdio.h>
#include<stdlib.h>
#include"eightQueen.h"
//定义皇后数量和棋盘大小
int queenNum = 8;
#define MAX_NUM 8
int chessBoard[MAX_NUM][MAX_NUM];
//检查当前位置的皇后是否合规(和任何皇后不在同一行/列/对角线)
//此处我们是每一行只放一个皇后所以不用检查行
int check(int x,int y){
int i,back;
for(i = 0;i < y;i++){
//检查列
if(chessBoard[x][i] == 1){
back = 0;
}
//检查左上对角线
if((x - 1 - i >= 0) && chessBoard[x - 1 - i][y - 1 - i] == 1){
back = 0;
}
//检查右下对角线
if(x + 1 + i < MAX_NUM && chessBoard[x + 1 + i][y + 1 + i] == 1){
back = 0;
}
}
back = 1;
return back;
}
//从第一行开始依次摆放,我们只需要确定y轴列数然后判断皇后位置合法性就行。
int eightQueen(int y){
int i,j,back;
if(y == MAX_NUM){
back = 1;
}
for(i = 0;i < MAX_NUM;i++){
//为当前行清零,避免回溯时出现脏数据
for(j = 0;j < MAX_NUM;j++){
chessBoard[j][y] = 0;
}
if(1 == check(i,y)){
chessBoard[j][y] = 1;
if(eightQueen(y + 1)){
back = 1;
}
}
}
back = 0;
//打印八皇后位置
int k,l;
for(k = 0;k < MAX_NUM;k++){
for(l = 0;l < MAX_NUM;l++){
printf("%d\n",chessBoard[k][l]);
}
}
}
#include<stdlib.h>
#include"eightQueen.h"
//定义皇后数量和棋盘大小
int queenNum = 8;
#define MAX_NUM 8
int chessBoard[MAX_NUM][MAX_NUM];
//检查当前位置的皇后是否合规(和任何皇后不在同一行/列/对角线)
//此处我们是每一行只放一个皇后所以不用检查行
int check(int x,int y){
int i,back;
for(i = 0;i < y;i++){
//检查列
if(chessBoard[x][i] == 1){
back = 0;
}
//检查左上对角线
if((x - 1 - i >= 0) && chessBoard[x - 1 - i][y - 1 - i] == 1){
back = 0;
}
//检查右下对角线
if(x + 1 + i < MAX_NUM && chessBoard[x + 1 + i][y + 1 + i] == 1){
back = 0;
}
}
back = 1;
return back;
}
//从第一行开始依次摆放,我们只需要确定y轴列数然后判断皇后位置合法性就行。
int eightQueen(int y){
int i,j,back;
if(y == MAX_NUM){
back = 1;
}
for(i = 0;i < MAX_NUM;i++){
//为当前行清零,避免回溯时出现脏数据
for(j = 0;j < MAX_NUM;j++){
chessBoard[j][y] = 0;
}
if(1 == check(i,y)){
chessBoard[j][y] = 1;
if(eightQueen(y + 1)){
back = 1;
}
}
}
back = 0;
//打印八皇后位置
int k,l;
for(k = 0;k < MAX_NUM;k++){
for(l = 0;l < MAX_NUM;l++){
printf("%d\n",chessBoard[k][l]);
}
}
}
相关文章推荐
- 约瑟夫环问题分析-C语言经典面试题
- 【经典面试题】有关指针、内存空间如何申请调用的问题
- 技术部面试题——经典智力问题收集
- 输出1到N之间所有相加等于M的数字组合(背包问题)求相加为M的所有组合--微软酷派经典面试题
- BM经典面试题:挑战你的逻辑分析能力(病狗问题)
- 经典面试题:链表的相交与环问题
- c语言经典算法——猴子偷桃问题
- 从经典的八皇后问题看回溯
- 快速深入一门语言的几个问题(Python面试题、笔试题、快速深入一门语言的绝招)
- 阿里巴巴技术部面试题——经典智力问题收集
- 面试题——C/C++经典问题,及面试笔试题
- 经典面试题:链表的相交与环问题
- 经典面试题:链表的相交与环问题
- java经典面试题-100m球自由下落问题
- 经典算法回顾 (Java版)—— 八皇后问题
- C语言经典问题学习笔记之一
- c语言经典算法——猴子偷桃问题
- 面试经典之剑指offer--58--八皇后问题
- 回溯经典问题之八皇后问题
- 《剑指Offer》面试题:八皇后问题