zoukankan      html  css  js  c++  java
  • [poj百练]2754:八皇后 回溯

    描述

      会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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

    把八皇后的解打表即可
    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    #include <algorithm>
    #include <math.h>
    using namespace std;
    #define LL long long
    
    #define N 8
    int x[N];
    int ans;
    LL s[93];
    
    bool CanPlace(int row)
    {
        for (int i = 0; i < row; i++) {
            if (x[row]==x[i] || abs(row-i)==abs(x[row]-x[i]))
                return 0;
        }
        return 1;
    }
    
    void print()
    {
        /*for (int i = 0; i < N; i++)
            printf("%d", x[i]+1);
        printf("
    ");*/
        for (int i = 0; i < N; i++) {
            s[ans] = 10*s[ans] + x[i]+1;
        }
    }
    
    void solve(int row)
    {
        if (row == N) {
            ans++;
            print();
            return;
        }
        for (int i = 0; i < N; i++) {
            x[row] = i;
            if (CanPlace(row))
                solve(row+1);
        }
    }
    
    int main()
    {    
        //freopen("1.txt", "r", stdin);
        memset(s, 0, sizeof(s));
        solve(0);
        int T;
        cin >> T;
        while (T--) {
            int n;
            cin >> n;
            cout << s[n] << endl;
        }
    
        return 0;
    }
     
  • 相关阅读:
    PostgreSQL管理工具:pgAdminIII
    PostgresQL7.5(开发版)安装与配置(win2003测试通过)
    让PosggreSQL运行得更好
    在.NET程序中使用PIPE(管道技术)
    在浏览网页过程中,单击超级链接无任何反应
    字符串转换
    数组初始化
    使用现有的COM
    后台服务程序开发模式(一)
    COM的四本好书
  • 原文地址:https://www.cnblogs.com/whileskies/p/7168581.html
Copyright © 2011-2022 走看看