您的位置:首页 > 其它

八皇后问题自我总结

2016-11-05 16:06 211 查看

八皇后

Description

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

Input

No
Output

输出所有八皇后问题的解

注解:在国际象棋中,皇后可以吃掉在同一行、列、斜线的其他的棋子。


 
      八皇后是一个经典的题目(作为一个菜鸟这是我碰到的比较难的一个题,所以自我总结一下,大佬请直接跳过)

 
      在本题中我使用的是c语言(菜鸟只会这个,还在学习中)。

 
      在整个代码中我用三个不同的函数(printarray,check,placeQueen)来解决问题,printarray用来输出最后的解,check用来检查当前放置的棋子是否符合题意,planeQueen(dfs)用来不停地放置棋子。

 
      我用一个一维数组来表示一个解,用printarray来翻译这个一维数组使其变成最后的答案。

                                                                   例:04752613:
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0

        如上图所示:每一位数字都代表一行中第n+1位有一枚棋子,第一位数字为0,第一行的0+1位就表示有一个皇后。
        其中check函数中来检查当前放置的棋子是否正确,diff=abs(chess[row]-chess[i]),diff==0时代表有同一列有多个皇后,diff==row-i时代表在同一斜线上有多个皇后(因为在这个一维数组中每一位数代表一枚棋子的位置,所以不存在同一行有两个棋子)。
        placeQueen函数使用了dfs算法,chess[row]=i代表落入一个棋子,然后用check函数来检查对错,一旦错误这一路径将终结,正确将开始下一次计算,只有当row==N时,当前的一维数组才是正确的,用printarray函数来输出答案。
#include<stdio.h>
#include<math.h>
#define N 8
int chess
;
int num=1;
int main(){
void printarray(int[]);
int check(int);
void placeQueen(int);
placeQueen(0);
return 1;
}

void printarray(int data[8]){
int i,j;
printf("No.%2d:\n",num++);
for(j=1;j<=N;j++){
for(i=0;i<N;i++)
if(i==data[j-1])printf("1 ");
else printf("0 ");
printf("\n");
}
}

int check(int row){
int i;
for(i=0;i<row;i++){
int diff=abs(chess[row]-chess[i]);
if(diff==0||diff==row-i)return 0;
}
return 1;
}

void placeQueen(int row){
int i;
if(row==N){
printarray(chess);
return;
}
else for(i=0;i<N;i++){
chess[row]=i;
if(check(row))
placeQueen(row+1);
}
}
        如果有需要的朋友,可以转载本文。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: