8皇后问题

八皇后问题是典型的在解空间中深度优先递归搜索,遍历解空间树,寻找问题的所有解的问题。是回溯法(深度优先搜索)算法的典型例子。

深度优先搜索算法(DFS)的算法框架:

Proc
If (当前节点是目标结点)
Then { output() }
Else
{
for(对于所有可能的新结点)
search(新结点);
}

八皇后问题描述:
这里写图片描述

//8皇后程序输出92种结果
//这里我将上题修改成了n皇后,即按输出的n值,输出n皇后的所有摆放结果
#include<stdio.h>
#include<math.h>

int Queen[100];  //记录皇后的位置Queen[i] = j;表示第i行的皇后的在第j列
int sum = 0;     //记录当前是第几个解
int n;           //n皇后

void backtrack(int m); //递归函数
void output();         //每得到一个解,按格式输出结果
int canplace(int m);   //判断当前第m行的皇后是否与前边已经放置的皇后冲突

int main()
{
    scanf("%d",&n);

    backtrack(0);

    return (0);
}


void backtrack(int m)
{
    if(m == n)
    {
        sum++;
        output();
    }
    else
    {
        int i;
        for(i = 0;i < n;i++)
        {
            Queen[m] = i;
            if( canplace(m) )
                backtrack(m + 1);
        }
    }
}



int canplace(int m)
{
    int i;
    for(i = 0;i < m;i++)
        if((abs(m - i) == abs(Queen[m] - Queen[i])) || Queen[m] == Queen[i])
            return (0);
    return (1);
}



void output()
{
    int i,j;
    printf("NO %d\n",sum);

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            if(Queen[i] == j)
                printf("# ");
            else
                printf("* ");
        }
        printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值