任务描述

本关任务:假设已放了8个皇后的棋盘(在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后)。用回溯法解8个皇后问题的全部解。

编程要求

定义函数Try(i),用来试探放第i行上的皇后。
讨论将第i行上的皇后放在j列位置上的安全性,可以逐行地放每一个皇后,在做这一步时,第i行上还没有皇后,不会在行上遭到其他皇后的攻击。只考虑来自列和对角线的攻击。定义q(i)=j表示第i行上的皇后放在第j列,一旦这样做了,就要考虑第i个皇后所在的列不安全了,让C[j]=false,同时,要考虑通过(i,j)位置的两条对角线也不安全了,得出从左上到右下的对角线上的每个位置都有“i-j=常数”的特点;从左下到右上的对角线上的每个位置都有“i+j=常数”的特点。得出在(i,j)位置放皇后的安全条件为
nq=C[j]&&L[i-j+9]&&R[i,j]
假如,C[j],L[k], R[m]为布尔型

测试说明

平台会对你编写的代码进行测试:

预期输出:

92

C语言实现

#include<stdio.h>
#include<math.h>
int resultCount=0;//记录解的个数
int n=0;//皇后个数
int result[1000]={0};
int Place(int t){
    int re=1;
    //判断与前面的t-1个皇后位置是否冲突
    for(int i=0;i<t;i++){
        if(result[t]==result[i]||t-i==fabs(result[t]-result[i])){
            re=0;
            break;
        }
    }
    return re;
}

void Backtrack(int t){
    if(t>=n){
        resultCount++;
        //打印解
        // for(int i=0;i<n;i++){
        //     printf("%d  ",result[i]);
        // }
        // printf("\n");
        // printf("_______\n");
    }else{
        //求第t个皇后的可能行的位置
        for(int i=0;i<n;i++){
            result[t]=i;
            if(Place(t)){
                Backtrack(t+1);
            }
        }
    }

}


int main(void)  {
    //皇后个数为n
    n=8;
    Backtrack(0);//从零层开始递归
    //输出解
    printf("%d",resultCount);
    return 0;
}