数据结构我好爱:N皇后问题

DFS典型问题

核心:回溯

注意:Queen[i] = j表示该皇后位于第i行第j列;

(凡也是这样,看了最后输出结果才反映这个数组的用意,初始条件太重要啦!)

判断该位置是否可以放置皇后:

        在当前行 line 上遍历列号;

        1.判断同一列:之前放置的皇后与正准备放置的列号是否相同(列号=quenn[i] 的值)

        2.判断对角线:正方形对角线斜率绝对值为 1;

int isQueen(int line) {  //判断该列能否放置皇后,能放返回1,不能返回0
    for (int i = 1; i < line; i++) {   //检查是否在同一列上或者在同一对角线上
        if (queen[i] == queen[line] || abs(queen[i] - queen[line]) == line - i) {
            return 0;
        }
    }
    return 1;
}

皇后主体:

        确定当前行n,列号从 1 开始遍历,如果该位置可以放置皇后且已经放置了N个皇后,打印方案即可;否则深度+1,行变为n+1;(显然n从 1 开始取)

void Nqueen(int n,int N) {
    for (int i = 1; i <= N; i++) {
        queen[n] = i;
        if (isQueen(n)) { 
            if (n == N) { 
                count++;
                for (int i = 1; i <= N; i++) {
                    printf("%d ", queen[i]);
                }
                putchar('\n');
            }
            else {
                Nqueen(n + 1,N);  
            }
        }
    }
}

效果:

 

完整代码:

#include<stdio.h>
#include<malloc.h>
#include<math.h>

int queen[100];
int count = 0;
int isQueen(int line) {  //判断该列能否放置皇后,能放返回1,不能返回0
    int i;
    for (i = 1; i < line; i++) {   //检查是否在同一列上或者在同一对角线上
        if (queen[i] == queen[line] || abs(queen[i] - queen[line]) == line - i) {
            return 0;
        }
    }
    return 1;
}


void Nqueen(int n,int N) {
    int i;
    for (i = 1; i <= N; i++) 
    {
        queen[n] = i;
        if (isQueen(n)) { 
            if (n == N) { 
                count++;
                for (int i = 1; i <= N; i++) {
                    printf("%d ", queen[i]);
                }
                putchar('\n');
            }
            else {
                Nqueen(n + 1,N);  
            }
        }
    }
}

int main() {
    Nqueen(1,5);
    printf("\nall solutions = %d\n", count);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值