zoukankan      html  css  js  c++  java
  • 来来来!经典的八皇后!

    八皇后

    (1.0/1.0 points)
    题目描述

    8X8的国际象棋棋盘上被挖了一些洞,这些洞不能放棋子,求八皇后问题的摆放方案,输出一种方案即可

    输入格式

    棋盘用.表示正常格子,用#表示被挖掉的洞,一共8行8列

    输出格式

    输出从上到下的每一行的皇后所在列号(1-8)

    注意:只输出列号,只输出列号,最后的输出应该只是8个数字,第i个数字表示第i行的皇后在第几列,中间以空格隔开。

    样例输入
    ........
    ..##....
    ####....
    ........
    ........
    ........
    ........
    ....####
    样例输出
    6 2 7 1 4 8 5 3



     1 #include <iostream>
     2 using namespace std;
     3 
     4 const int offset = 9;
     5 
     6 int    row[9];
     7 bool col[9];
     8 bool k_eq_1[17];
     9 bool k_eq_minus1[17];
    10 char stage[9][9];
    11 
    12 void tryRow(int i)
    13 {
    14     if (i == 9)
    15     {
    16         for (int k = 1; k < 9; k++)
    17             cout << row[k] << " ";
    18         exit(0);
    19     }
    20     for (int j = 1; j < 9; j++)
    21     {
    22         if (stage[i][j] != '#' && col[j] && k_eq_1[i - j + offset] && k_eq_minus1[i + j])
    23         {
    24             row[i] = j;
    25 
    26             col[j] = false;
    27             k_eq_1[i - j + offset] = false;
    28             k_eq_minus1[i + j] = false;
    29 
    30             tryRow(i + 1);
    31 
    32             k_eq_minus1[i + j] = true;
    33             k_eq_1[i - j + offset] = true;
    34             col[j] = true;
    35         }
    36     }
    37 }
    38 
    39 int main(void)
    40 {
    41     for (int i = 1; i < 9; i++)
    42     {
    43         col[i] = true;
    44         for (int j = 1; j < 9; j++)
    45         {
    46             cin >> stage[i][j];
    47             k_eq_1[i - j + offset] = true;
    48             k_eq_minus1[i + j] = true;
    49         }
    50     }
    51 
    52     tryRow(1);
    53 
    54     return 0;
    55 }

    只是最经典的递归回溯深搜版,值得注意的就是 offset 。

    一条正对角线上 i-j 值都是相同的,所以可以用 i-j 表示某一正对角线是否被占用;

    同理,副对角线 i+j 都是相同的。

    offset 是为了使正对角线(i-j)与副对角线(i+j)落入相同的区间,好被数组统一处理而设定的,也就是正对角线的偏移量。由于所有 i-j 都偏移,所以不影响正确性。

    
    
  • 相关阅读:
    N in 1 & 多重引导光盘制作
    可启动 ISO 合并、Windows 安装光盘合集
    VS 2005 VC++ 文件类型
    Windows 无人值守安装应答文件详解
    30种下载Youtube视频的方法
    解释YOUTUBE FLV 地址
    Windows下进程通信方式[转]
    进程通讯 DELPHI的类实现
    c#.net常用函数列表
    Javascript, How to make a Dress Up Game (Drag and Drop)
  • 原文地址:https://www.cnblogs.com/maples7/p/4516523.html
Copyright © 2011-2022 走看看