计机羊咩咩 发表于 2014-11-15 18:08:55

八皇后问题

八皇后问题,头疼了三天
依然不知道如何写判断(写过一个笨方法,下皇后之后立刻对横竖及斜方向标记,事实上不行)

网上找到一段代码,巧妙的程度令人乍舌,但就是因为太巧妙了,几乎看不清楚作者的模型
作者已联系不上了,下面贴上这段代码,望有人能分析出原作者的模型
或者留言写下如何判断皇后放置位置的方法也行,感激不尽


以下是网上的源代码,可直接执行:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define N 8 //皇后数=棋盘行列数
int a; //a为第i行皇后所在列
void show() //图形化输出
{
        int i;
        int p, q;
        int b = { 0 };
        static t = 1;
        printf("第%d个解为: ", t++);
        for (i = 0; i<N; i++)
        {
                b] = 1;
                printf("(%d,%d) ", i, a);
        }
        printf("\n");
        for (p = 0; p<N; p++)
        {
                for (q = 0; q<N; q++)
                {
                        if (b == 1)
                                printf("●");
                        else
                                printf("○");
                }
                printf("\n");
        }
}
int check(int n) //满足条件返回1,否则返回0
{
        int i;
        for (i = 0; i<n; i++)
        {
                if (a == a || fabs(n - i) == fabs(a - a)) //at the same column or diagonal (对角线)
                        return 0;
        }
        return 1;
}
void put(int n) //在第n行放置第n个皇后
{
        int i;
        if (n == N)
                return;
        for (i = 0; i<N; i++)
        {
                a = i;
                if (check(n)) //位置合法
                {
                        if (n == N - 1) //皇后全部放置完毕
                                show();
                        else
                                put(n + 1);
                }
        }
}
int main()
{
        put(0);
        return 0;
}

qq351317878 发表于 2014-11-15 19:15:32

我记得好像可以用for循环出来不知道对不对 ,我只是菜鸟{:5_100:}

cahuzi2000 发表于 2017-1-16 11:30:50

看不懂,一想就头疼
页: [1]
查看完整版本: 八皇后问题