八皇后问题-------DFS 可视化

好久没有更新了,以后会在CSDN上不定期更新自己的一些代码,希望明天的自己能够更加努力!加油~

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 8
static int sum,x[N];                          //sum用于记录解法,x[N]记录皇后的位置

int judge(int t)                              //判断当前所下的皇后是否与棋盘上的皇后相冲突
{
    int i;

    for(i=0;i<t;i++)
        if(abs(x[t]-x[i])==abs(i-t)||x[t]==x[i])
            return 0;
    return 1;
}

void display( )                                   //打印棋盘
{
    int i,j;
    sum++;

    printf("\n\n第%d种解法 !\n",sum);
    for(i=0;i<N;i++)
    {
        if(i==0)
            printf("╓════╤════╤════╤════╤════╤════╤════╤════╖\n");
        for(j=0;j<N;j++)
        {
            if(j==0)
                printf("║");
            switch(x[i]==j)
            {
                case 0:printf("    ");break;
                case 1:printf(" ● ");break;
            }
            if(j<N-1)
                printf("║");
            if(j==N-1)
                printf("║\n");
        }
        if(i<N-1)
            printf("╠════╫════╫════╫════╫════╫════╫════╫════╢\n");
        if(i==N-1)
            printf("╙════╧════╧════╧════╧════╧════╧════╧════╜");
    }
}

void think(int k)               
{
    int i;

    if(k==N)                             //可以抽象的理解为构造了一棵状态搜索树,当遍历到叶子结点时打印                 
        display( );
    else
    {
        for(i=0;i<N;i++)
        {
            x[k]=i;
            if(judge(k))
                think(k+1);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40552964/article/details/82632776
今日推荐