八皇后问题

八皇后问题

#include<stdio.h>
#include"windows.h"

#define N 8//定义棋盘大小
int place(int k);//确定某一位置皇后放置与否,放置则返回1,反之返回0
void backtrack(int i);//主递归函数,搜索解空间中第i层子树
void chessboard();//每找到一个解,打印当前棋盘状态
static int sum;//当前已找到解的个数
static int x[N];//记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列

int main(void)
{
    backtrack(0);
    system("pause");
    return 0;
}

int place(int k)
{
    if(k==0)//首行随便放,不会冲突
        return 1;

    for(int j = 0;j < k;j++)//从首行到当前行
    {
        if(abs(k-j) == abs(x[j] - x[k])/* 当前行(第k行)与第j行,共对角线。行数差等于列数差 */ || (x[j] == x[k])/*当前行(第k行)与第j行,共列*/ )//判断冲突
        {
            return 0;//冲突返回0
        }
    }
    return 1;
}

//穷举,逐行放置,边放边校验
void backtrack(int t)//第t行
{
    //t == N时,算法搜索至叶节点,得到一个新的N皇后互不攻击的放置方案
    if(t == N)//t==N-1是最后一次放置,t==N就是通过了
        chessboard();
    else
        for(int i= 0; i < N;i++)
        {
            x[t] = i;//假设第t行的放置位置在i
            if(place(t))//.校验是否冲突
            {
                backtrack(t+1);//校验不冲突则深入下一行
            }
        }
}

void chessboard()//打印结果
{
    printf("第%d种解法:\n",++sum);

    for(int i = 0;i < N;i++)
    {
        for(int j = 0;j < N;j++)
            if(j == x[i])
                printf("@");
            else
                printf("*");
        printf("\n");
    }
    printf("\n");
}
#include<stdio.h>
#include"windows.h"

#define N 8//定义棋盘大小
int place(int k);//确定某一位置皇后放置与否,放置则返回1,反之返回0
void backtrack(int i);//主递归函数,搜索解空间中第i层子树
void chessboard();//每找到一个解,打印当前棋盘状态
static int sum=0;//当前已找到解的个数
static int x[N];//记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列

int main(void)
{
    backtrack(0);
    system("pause");
    return 0;
}

void backtrack(int line)
{
    if (line==N)
    {
        chessboard();
    } 
    else
    {
        for (int i=0;i<N;i++)
        {
            x[line]=i;
            if (place(line))
            {
                backtrack(line+1);
            }
        }
    }
}

int place(int line)
{
    if (line==0)
    {
        return 1;
    }

    for (int i=0;i<line;i++)
    {
        if ( x[line]==x[i] || (line-i)==abs(x[line]-x[i]) )
        {
            return 0;
        }
    }

    return 1;
}

void chessboard()
{
    printf("第 %d 个解:\n",++sum);
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<N;j++)
        {
            printf("%c",(x[i]==j)?'@':'*');
        }
        printf("\n");
    }
    printf("\n");
}

 

posted @ 2018-03-26 14:57  sky20080101  阅读(79)  评论(0)    收藏  举报