因为痛,所以叫青春

我有一个梦想:穷屌丝变身富屌丝
八皇后问题
View Code
我写这个代码的原因是因为,八皇后问题是一个非常经典的递归问题,自己又掌握的不是很熟练,为了防止忘记,可以随时拿出来看一看,加深理解
#include<stdio.h>
int num; // 统计方案数目
int q[9]; // 记录每行皇后所在的列号
int c[9]; // 标记当前列是否安全,值取0(不安全)或1(安全)
int l[17]; // 标记左上到右下的对角线是否安全,值取0(不安全)或1(安全)
int r[17]; // 标记坐下到右上的对角线是否安全,值取0(不安全)或1(安全)
void queen(int i)
{
    int j,k;
    for(j = 1;j <= 8; ++j)
    {
        if(c[j] && l[i-j+9] && r[i+j])        // (i,j)所在的位置是安全的
        {
            q[i] = j;                        // 存储当前皇后的列位置
            c[j] = 0;
            l[i-j+9] = 0;
            r[i+j] = 0;                        // 修改(i,j)位置的三个安全标记
            if(i < 8)
                queen(i+1);                    // 未放完8个皇后的,继续放下一个
            else                            // 已放完皇后的,执行如下操作
            {
                num++;                        // 方案计数加1
                printf("方案%2d: ",num);    // 输出方案数
                for(k = 1;k <= 8; k++)
                    printf("%d ",q[k]);     // 输出
                printf("\n");
            }
            c[j] = 1;
            l[i-j+9] = 1;
            r[i+j] = 1;
        }
    }
}
int main()
{
    int i;
    num = 0;
    for(i = 0;i < 9; ++i)
        c[i] = 1;
    for(i = 0;i < 17; i++)
        l[i] = r[i] = 1;
    queen(1);
    return 0;
}

posted on 2012-05-22 19:36  Nice!  阅读(173)  评论(0编辑  收藏  举报