八皇后问题-C实现

来源:互联网 发布:水晶报表软件下载 编辑:程序博客网 时间:2024/05/21 19:31

最近程序的这些算法可是吃了点小亏。这是一个困饶了我很久的一个问题,以前不止一次有小伙伴同学讨论这算法个话题,每次我都觉得太难所以都只是听听不发表意见,知道最近有考试了才发现,我一直逃避的这些问题身为计算机专业的我根本不可能逃避的。所以既然逃不过那今天静下心来好好学习学习,就先从这个八皇后问题开始吧。
说实话这程序不是我自己的原创,不过借鉴别人的成果总能快速学习的对吧,比自己慢慢研究要高效很多。里面一个函数对于高手来说肯定不存在什么问题,就不要嘲笑我了。但是我自己本来就是菜鸟,所以我还是照顾 一下和我一样菜鸟的小伙伴,所以我还是介绍一下。里面有一个abs()函数这个是输出绝对值函数例如abs(-8)=8;abs(8)=8。在其他的也没啥了。

#include<stdio.h>#include<math.h>#define N 4int cin = 1;bool a[N + 1][N + 1] = { 1 };bool scan(bool a[N+1][N+1]);//输出地图函数bool Trial(int i);//循环行和列函数bool Decide(bool a[N+1][N+1],int i,int j );//判断是否满足要求int main(){    Trial(1);//从第一行开始判断    return 0; }bool  scan(bool a[N + 1][N + 1]){//输出地图函数    printf("sum=%d\n",cin++);    for (int i = 1; i < N + 1; i++)    {        for (int j = 1; j < N + 1; j++)         {            a[i][j] == 1? printf("%2d", 0) : printf(" *");        }        printf("\n");    }    return true;}bool Trial(int i){//循环行和列函数    if (i > N)        scan(a);    else         for (int j = 1; j < N + 1; j++)        {            a[i][j] = 1;            if (Decide(a, i, j))                Trial(i + 1);            a[i][j] = 0;        }    return true;}bool Decide(bool a[N + 1][N + 1], int i, int j){//判断是否满足要求    for (int m = 1; m <i; m++)//行    {        for (int n = 1; n < N + 1; n++)//列        {            if (a[m][n]==1)            if (n == j || abs(i - m) == abs(j - n))                return false;        }    }    return true;}