• 九度oj 题目1140:八皇后


    题目描述:

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

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <string>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 #define MAX 10
     8 #define inf 1000000009
     9 int mat[MAX][MAX];
    10 int temp[MAX];
    11 int ans[100][MAX];
    12 int cnt = 0;
    13 
    14 bool isOk(int x, int y) {
    15     int a = 0, b = 0;
    16     for(int i = 0; i < 8; i++) {
    17         a = a + mat[x][i];
    18         b = b + mat[i][y];
    19         if(a >= 1 || b >= 1) {
    20             return false;
    21         }
    22     }
    23     for(int i = x - 1 , j = y-1; i >=0 && j >= 0; i--, j--) {
    24         if(mat[i][j] == 1) {
    25             return false;
    26         }
    27     }
    28     for(int i = x - 1 , j = y+1; i >=0 && j < 8; i--, j++) {
    29         if(mat[i][j] == 1) {
    30             return false;
    31         }
    32     }
    33     return true;
    34 }
    35 
    36 void dfs(int n) {
    37     if(n == 8) {
    38         cnt++;
    39         for(int i = 0; i < 8; i++) {
    40             ans[cnt][i] = temp[i];
    41         }
    42         return;
    43     }
    44     for(int i = 0; i < 8; i++) {
    45         if(isOk(n,i)) {
    46             mat[n][i] = 1;
    47             temp[n] = i+1;
    48             dfs(n+1);
    49             mat[n][i] = 0;
    50         }
    51     }
    52 }
    53 
    54 int main(int argc, char const *argv[])
    55 {
    56     int n;
    57     //freopen("input.txt","r",stdin);
    58     memset(mat, 0, sizeof(mat));
    59     dfs(0);
    60     while(scanf("%d",&n) != EOF) {
    61         while(n--) {
    62             int m;
    63             scanf("%d",&m);
    64             for(int i = 0; i < 8; i++) {
    65                 printf("%d",ans[m][i]);
    66             }
    67             puts("");
    68         }
    69         
    70     }
    71     return 0;
    72 }

     其实,判断是否可以放置的代码还可以利用temp,使其更简洁

     1 #include <cstdio>
     2 #include <string>
     3 #include <cstring>
     4 #define MAX 10
     5 int mat[MAX][MAX];
     6 int temp[MAX];
     7 int ans[100][MAX];
     8 int cnt = 0;
     9 
    10 bool isOk(int x, int y) {
    11     for(int i = 0; i < x; i++) {
    12         if(temp[i]-1 == y) {
    13             return false;
    14         }
    15         if(temp[i]-1+ i == (x+y) || temp[i] -1 - i == (y-x)) {
    16             return false;
    17         }
    18     }
    19     return true;
    20 }
    21 
    22 void dfs(int n) {
    23     if(n == 8) {
    24         cnt++;
    25         for(int i = 0; i < 8; i++) {
    26             ans[cnt][i] = temp[i];
    27         }
    28         return;
    29     }
    30     for(int i = 0; i < 8; i++) {
    31         if(isOk(n,i)) {
    32             mat[n][i] = 1;
    33             temp[n] = i+1;
    34             dfs(n+1);
    35             mat[n][i] = 0;
    36         }
    37     }
    38 }
    39 
    40 int main(int argc, char const *argv[])
    41 {
    42     int n,m;
    43     memset(mat, 0, sizeof(mat));
    44     dfs(0);
    45     while(scanf("%d",&n) != EOF) {
    46         while(n--) {
    47             scanf("%d",&m);
    48             for(int i = 0; i < 8; i++) {
    49                 printf("%d",ans[m][i]);
    50             }
    51             puts("");
    52         }
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    扫描FTP,保存文件
    读取本地配置文件
    Infinity 与 NAN
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    svn检出项目,Project *** is already imported into workspace
    [编写高质量代码:改善java程序的151个建议]建议69 列表相等只需关心元素相等
    [编写高质量代码:改善java程序的151个建议]建议68 频繁插入和删除时使用LinkedList
    [编写高质量代码:改善java程序的151个建议]建议67 不同的列表选择不同的遍历方法
    [编写高质量代码:改善java程序的151个建议]建议66 asList方法产生的List对象不可更改
    点滴记录--批量添加数据(千万级)方法
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5738376.html
Copyright © 2020-2023  润新知