zoukankan      html  css  js  c++  java
  • 搜索6--noi1700:八皇后问题

    搜索6--noi1700:八皇后问题

    一、心得

    二、题目

    1756:八皇后

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

    三、分析

    DFS

    四、AC代码

     1 //1700:八皇后问题
     2 /*
     3 
     4 */ 
     5 #include <iostream>
     6 using namespace std;
     7 //用来存储方案 ,下标都是从1开始 
     8 int a[93][9]; 
     9 int visRow[9]; //
    10 int visLeftIncline[17];//左斜线 使用的时候 row+column 
    11 int visRightIncline[16]; //右斜线,使用的时候row-column+8 
    12 int ansCount=1;
    13 
    14 void init(){
    15     
    16 }
    17 
    18 void print(){
    19     int case1;
    20     cin>>case1;
    21     int detailCase;
    22     while(case1--){
    23         cin>>detailCase;
    24         for(int i=1;i<=8;i++){
    25             cout<<a[detailCase][i];
    26         }
    27         cout<<endl;
    28     }
    29     
    30 } 
    31 
    32 void search(int column){
    33     if(column>8){
    34         ++ansCount; 
    35         //因为是树形结构,所以下面的解要用到前面的解
    36         //因为是直接从中间开始,所以前面的值直接用 ansCount-1填
    37         
    38         for(int i=1;i<=8;i++){
    39             a[ansCount][i]=a[ansCount-1][i];
    40         }
    41     }
    42     else{
    43         for(int row=1;row<=8;row++){
    44             if(!visRow[row]&&!visLeftIncline[row+column]&&!visRightIncline[row-column+8]){
    45                 visRow[row]=1;
    46                 visLeftIncline[row+column]=1;
    47                 visRightIncline[row-column+8]=1;
    48                 a[ansCount][column]=row;
    49                 search(column+1);//找下一列
    50                 //回溯 
    51                 visRow[row]=0;
    52                 visLeftIncline[row+column]=0;
    53                 visRightIncline[row-column+8]=0;
    54             }
    55         }
    56     }
    57 }
    58 
    59 int main(){
    60     init(); 
    61     search(1);
    62     print();
    63     return 0;
    64 } 

    五、注意点

    1、标红位置的代码看一下

    因为是树形结构,所以下面的解要用到前面的解
    因为是直接从中间开始,所以前面的值直接用 ansCount-1填
  • 相关阅读:
    AtCoder Beginner Contest 205
    Codeforces Round #725 (Div. 3)
    Educational Codeforces Round 110 (Rated for Div. 2)【A
    Codeforces Round #722 (Div. 2)
    AtCoder Beginner Contest 203(Sponsored by Panasonic)
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    PTA 520 钻石争霸赛 2021
    Educational Codeforces Round 109 (Rated for Div. 2)【ABCD】
    AtCoder Beginner Contest 200 E
    Educational Codeforces Round 108 (Rated for Div. 2)【ABCD】
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7348084.html
Copyright © 2011-2022 走看看