NOJ 1007 8皇后问题

5 篇文章 0 订阅

2016.10.19

【题目描述】
8皇后问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:
输出8皇后问题所有结果。

输出:
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

【解题思路】
8皇后是经典的回溯问题,这个程序中利用了状态压缩,用a[i]表示第i个皇后所在的位置,比起用二位数组表示减少了很多冗余状态,值得学习。

【代码实现】

# include <stdio.h>

int n = 8;
int a[10] = {0};
int count = 0;

void search(int );
int judge(int ,int );
void output();
int abs(int );

int main(void)
{
    search(1);

    return 0;
}

void search(int k)
{
    int i;

    if (k == n + 1)
        output();
    else
    {
        for (i = 1; i <= n; ++i)
            if (judge(k, i))
            {
                a[k] = i;
                search(k + 1);
                a[k] = 0;//恢复状态很重要
            }
    }
}

int judge(int row, int col)
{
    int i, flag;

    flag = 1;
    for (i = 1; i <= row; ++i)
        if (a[i] == col)
            flag = 0;
    if (flag)
    {
        for (i = 1; i <= row; ++i)
            if (abs(i - row) == abs(a[i] - col))//判断对角线的条件
                flag = 0;
    }

    return flag;
}

void output()
{
    int i, j;

    count++;
    printf("No %d:\n", count);
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= n; ++j)
            if (a[i] == j)
                printf("A");
            else
                printf(".");
        printf("\n");
    }
}

int abs(int k)
{
    if (k < 0)  
        return -k;
    else 
        return k;
}

【心得体会】
状态压缩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值