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填
  • 相关阅读:
    文件操作
    python中的函数递归和迭代问题
    函数的闭包与装饰器
    函数的名称空间和作用域
    python学习之路(四) ---函数
    python __name__问题
    浅谈python中的引用和拷贝问题
    Python中的缩进问题
    粘包现象
    socket编程
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7348084.html
Copyright © 2011-2022 走看看