zoukankan      html  css  js  c++  java
  • 递归

    题目描述

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

    求解思路

    将每一种皇后串求出来保存在一个数组中,题目要什么给什么。在求解皇后串的时候,设函数queen(int n)表示前 n-1行的皇后都已经摆好位置了,将第n行的位置与前面n-1行皇后的位置进行比较,如果不冲突,就接受第n行摆放位置,写入,然后继续调用queen(n+1)处理第n+1行皇后的位置。

    解题代码

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    
    int List[92][8], row[8], cnt;
    
    void Queen(int n){
        if(n == 8){
            for(int i = 0; i < 8; i++){
                List[cnt][i] = row[i];
            }
            cnt++;
            return;
        }
        for(int i = 1; i <= 8; i++){
            int k;
            for( k = 0; k < n; k++){
                if(i == row[k] || fabs(k - n) == fabs(row[k] - i))
                    break;
            }
            if(k == n){
                row[n] = i;
                Queen(n+1);
            }
        }
        
    }
    
    int main(){
        int n;
        scanf("%d", &n);
        Queen(0);
        while(n--){
            int a;
            scanf("%d", &a);
            for(int i = 0; i < 8; i++){
                printf("%d", List[a-1][i]);
            }
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    LeetCode-62. Unique Paths
    南大算法设计与分析课程课后习题(3)
    linux-2.6.18源码分析笔记---信号
    南大算法设计与分析课程复习笔记(4)L4
    南大算法设计与分析课程复习笔记(3)L3
    南大算法设计与分析课程复习笔记(2)L2
    南大算法设计与分析课程OJ答案代码(2)最大子序列和问题、所有的逆序对
    【zz】史上最全设计模式导学目录(完整版)
    gtest学习
    全文检索及ElasticSearch框架学习
  • 原文地址:https://www.cnblogs.com/zhangyue123/p/12726385.html
Copyright © 2011-2022 走看看