• OpenJudge 2754 八皇后


    1.链接地址:

    http://bailian.openjudge.cn/practice/2754

    2.题目:

    总时间限制:
    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
    

    3.思路:

    首先把说有可能的情况保存到一个vector再查询

    寻找方法利用递归+mark

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <vector>
     4 
     5 using namespace std;
     6 
     7 int arr[8][8];
     8 vector<int> v_res;
     9 
    10 void f(int sum,int i)
    11 {
    12     //cout<< "f(" << sum << "," << i << ")" <<endl;
    13     int j,k;
    14     for(j = 0; j < 8; ++j)
    15     {
    16         if(arr[i][j] == 0)
    17         {
    18             if(i == 7)
    19             {
    20                 v_res.push_back(sum * 10 + (j + 1));
    21             }
    22             else
    23             {
    24                 arr[i][j] = 1;
    25                 for(k = i + 1; k < 8; ++k) arr[k][j] += 1;
    26                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] += 1;
    27                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] += 1;
    28                 f(sum * 10 + (j + 1), i + 1);
    29                 arr[i][j] = 0;
    30                 for(k = i + 1; k < 8; ++k) arr[k][j] -= 1;
    31                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] -= 1;
    32                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] -= 1;
    33             }
    34         }
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     //freopen("C://input.txt","r",stdin);
    41 
    42     int n;
    43     cin>>n;
    44 
    45         f(0,0);
    46 
    47     int b;
    48     while(n--)
    49     {
    50         cin>>b;
    51         cout<<v_res[b - 1]<<endl;
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    简单的嵌套循环
    七、 二进制位运算
    六、字符串格式化--------列表常用操作
    JavaScript取消默认控件并添加新控件(DOM编程艺术第11章)
    JavaScript 字符串拼接 & setInterval()实现简单动画
    伪站创建代码-山东理工
    CSS常用样式
    CSS基础知识
    HTML5其他标签应用
    HTML表单的应用
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3556810.html
Copyright © 2020-2023  润新知