八皇后问题

来源:互联网 发布:淘宝卖家账号注册 编辑:程序博客网 时间:2024/06/10 15:11

问题描述:

八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。在8×8格的国

象棋棋盘上放置八个皇后,使得任意两个皇后不能互相攻击,即任何行、列或对角

线(与水平轴夹角为45°或135°的斜线)上不得有两个或两个以上的皇后。这样的

一个格局称为问题的一个解。


问题分析:

一个正确的解应当是每一列,每一行,每一条斜线上均只有一个皇后。


借用的图示:




#include<stdio.h>#include<string.h>#define N 8int p[N+1];int num;void show(){printf("\t%d\n",++num);for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){if(p[i]==j){printf(" *");}else{printf(" .");}}printf("\n");}}int check(int n,int k){for(int i=1;i<n;i++){//判断前 n 行上是否有要填的位置有歧义的 ,不包括该行if(p[i]==k)return 0;if(p[i]-i==k-n)return 0;if(p[i]+i==k+n)return 0;}return 1;}void find(int n){if(n>N){show();return ;}else{for(int i=1;i<=N;i++){if(check(n,i)){p[n]=i;  // n 为数组 p 的下标,记下列 find(n+1);}}}} int main(){memset(p,0,sizeof(p));num=0;find(1);return 0;}


0 0
原创粉丝点击