八皇后的一个回溯递归解法

解法来自严蔚敏的数据结构与算法。

代码如下:

#include <iostream>
using namespace std;
const int N = 8;//皇后数
int count = 0;//解法统计
int a[N][N];//储存值的数组

const char *YES = "■";
const char *NO = "□";
//const char *YES = "●";
//const char *NO = "○";

//打印一个结果。
void printOneResult(){
    cout<<"------------第"<<count<<"种----------"<<endl;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            if(a[i][j] == 1){
                cout<<YES<<" ";
            }else{
                cout<<NO<<" ";
            }
        }
        cout<<endl;
    }
    cout<<"-----------end-------------"<<endl;
}

//放棋子
void put(int i, int j){
    a[i][j] = 1;
}

//拿走棋子
void remove(int i, int j){
    a[i][j] = 0;
}

//参数是否合法
bool isParameterValid(int parameter){
    if(parameter < 0 || parameter > N - 1)
        return false;
    return true;
}

//判断,本次放的棋子是否符合题目要求。
bool isValid(int i, int j){
    if(a[i][j] != 1 || !isParameterValid(i) || !isParameterValid(j)){
        cout<<"isValid中,传入参数错误!"<<endl;
        return false;
    }    
    for(int k = 1; k <= i ; k++){
        if  (isParameterValid(i - k) && (
                    (a[i - k][j] != 0) ||
                    (isParameterValid(j - k) && a[i - k][j - k] != 0) ||
                    (isParameterValid(j + k) && a[i - k][j + k] != 0)
                )
            ){
                return false;
            }
    }
    return true;
}

//递归函数。
void Trial(int i, int n){//i表示第i行,n表示最大行数。
    if(i > n){//i > n表示,找到了一个正确结果。:)
        count++;
        printOneResult();
    }else{
        for(int j = 0; j <= n; j++){//走到这里说明。前i-1行都已经是正确的放法了,这次尝试第i行。
            put(i, j);//第i行第j个也就是a[i][j]放上棋子
            if(isValid(i, j)){//棋子合法
                Trial(i + 1, n);//进行下一个判断。
            }
            remove(i, j);//不管棋子合法不合法,这一位都已经尝试过了所有可能,所以remove掉,开始第j + 1的循环。
        }
    }

}


int main(){    
    Trial(0, 7);
    return 0;
}

这个好像不算长。思路也还算清晰,这应该是最容易想到的八皇后解法了吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值