计算机保研复试刷题——八皇后

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35564813/article/details/82628905

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入描述:
每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出描述:
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
示例1
输入
1
输出
15863724

//考点:象棋,八皇后;知识点:递归
//S(n) = O(n!),递归
//思路:定义二维数组为92种解法的存储位置,根据题意选择适当的解
//步骤:1.初始化全局变量a[95][10],c[10],total置0;深度优先遍历棋盘,定义函数dfs(cur),cur表示从cur行开始检测通路
//2.0~7进行i循环,根据题意选择其实行对应的解——8位整数串
//3.详细dfs定义:如果cur为8,则total+1,0~7遍历a[total][i]=c[i]
//4.否则0~7循环,c[cur]接收索引i,初始ok为1,内层循环j从0~cur - 1,ok置0并退出内层循环的条件是c[j] == i 或cur - i == j - c[j]或cur + i ==c[j] + j。
//5.内层循环结束后如果ok那递归调用dfs(cur + 1)
#include<bits/stdc++.h>
using namespace std;
int a[95][10];//解
int c[10];
int total = 0;
//深度优先遍历
void dfs(int cur){//起始位置
    if(cur == 8){
        total++;
        for(int i = 0; i < 8; i++){
            a[total][i] = c[i];
        }
    }else{
        for(int i = 0; i < 8; i++){
            c[cur] = i;//标记位置,遍历对应行所有列
            int ok = 1;//默认是所求的解
            for(int j = 0; j < cur; j++){//与本行前面选择过的数字比较,如果行、列、对角线都不在一条直线上,则递归下一行
                if(c[j] == i || cur - i == j - c[j] || cur + i == c[j] + j){//第一个条件比较的是在不在同一列,后面两个条件分别比较正对角线和负对角线在不在同一直线上
                    ok = 0;
                    break;//此方案行不通啊
                }
            }
            if(ok){//i循环中此路可行
                dfs(cur + 1);//检测下一行
            }
        }
    }
}
int main(){
    int N;
    while(scanf("%d", &N) != EOF){
        dfs(0);//从索引号0开始逐行检测是否有通路
        for(int i = 0; i < 8; i++){//8皇后
            printf("%d", a[N][i] + 1);//根据需要取方案
        }
        //cout<<endl;
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35564813/article/details/82628905