八皇后问题c++ 多题解 [不使用二维数组解法]

八皇后问题

Description
相信大家都听过经典的"八皇后"问题吧?
这个游戏要求在一个8×8的棋盘上放置8个皇后,
使8个皇后互相不攻击( 攻击的含义是有两个皇后在同一行或同一列或同一对角线上)。
桐桐对这个游戏很感兴趣,现在他想知道每种合法的摆放方案.
Input
Output
输出若干行,每行一个种方案,也就是8个数字,中间不要用空格分开
HINT

这是很经典的问题,不多说上代码:
方法一(DFS递归):

#include<iostream>
using namespace std;
static int gEightQueen[8],gCount=0;
void print() {
    for (int i=0; i < 8; i++) {
        int inner;
        for (inner=0; inner < gEightQueen[i]; inner++);
        cout <<inner+1;
    }
    cout<<endl;
}
int check_pos_valid(int loop, int value) {
    int index;
    int data;
    for (index=0; index < loop; index++) {
        data=gEightQueen[index];
        if (value == data)
            return 0;
        if ((index+data) == (loop+value))
            return 0;
        if ((index - data) == (loop - value))
            return 0;
    }
    return 1;
}
void eight_queen(int index) {
    int loop;
    for (loop=0; loop < 8; loop++) {
        if (check_pos_valid(index, loop)) {
            gEightQueen[index]=loop;
            if (7 == index) {
                gCount++, print();
                gEightQueen[index]=0;
                return;
            }
            eight_queen(index+1);
            gEightQueen[index]=0;
        }
    }
}
int main() {
    eight_queen(0);
    return 0;
}

方法一(暴力枚举法):

#include<bits/stdc++.h>
using namespace std;
int main() {
    for(int a1=1; a1<=8; a1++)
        for(int a2=1; a2<=8; a2++)
            for(int a3=1; a3<=8; a3++)
                for(int a4=1; a4<=8; a4++)
                    for(int a5=1; a5<=8; a5++)
                        for(int a6=1; a6<=8; a6++)
                            for(int a7=1; a7<=8; a7++)
                                for(int a8=1; a8<=8; a8++) {
                                    if(a1!=a2&&a1!=a3&&a1!=a4&&a1!=a5&&a1!=a6&&a1!=a7&&a1!=a8
                                        &&abs(a1-a2)!=1
                                        &&abs(a1-a3)!=2
                                        &&abs(a1-a4)!=3
                                        &&abs(a1-a5)!=4
                                        &&abs(a1-a6)!=5
                                        &&abs(a1-a7)!=6
                                        &&abs(a1-a8)!=7
                                        &&a2!=a3&&a2!=a4&&a2!=a5&&a2!=a6&&a2!=a7&&a2!=a8
                                        &&abs(a2-a3)!=1
                                        &&abs(a2-a4)!=2
                                        &&abs(a2-a5)!=3
                                        &&abs(a2-a6)!=4
                                        &&abs(a2-a7)!=5
                                        &&abs(a2-a8)!=6
                                        &&a3!=a4&&a3!=a5&&a3!=a6&&a3!=a7&&a3!=a8
                                        &&abs(a3-a4)!=1
                                        &&abs(a3-a5)!=2
                                        &&abs(a3-a6)!=3
                                        &&abs(a3-a7)!=4
                                        &&abs(a3-a8)!=5
                                        &&a4!=a5&&a4!=a6&&a4!=a7&&a4!=a8
                                        &&abs(a4-a5)!=1
                                        &&abs(a4-a6)!=2
                                        &&abs(a4-a7)!=3
                                        &&abs(a4-a8)!=4
                                        &&a5!=a6&&a5!=a7&&a5!=a8
                                        &&abs(a5-a6)!=1
                                        &&abs(a5-a7)!=2
                                        &&abs(a5-a8)!=3
                                        &&a6!=a7&&a6!=a8
                                        &&abs(a6-a7)!=1
                                        &&abs(a6-a8)!=2
                                        &&a7!=a8
                                        &&abs(a7-a8)!=1
                                        ) cout<<a1<<a2<<a3<<a4<<a5<<a6<<a7<<a8<<endl;
                                    }
}

没了…不要嫌弃太短了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值