zoukankan      html  css  js  c++  java
  • [转]Eight Queens algorithm With ABAP

    If you have time and interest in eight queens algorithm, then you can read this article, it is done by ABAP and tested in ECC6.

    REPORT z_8queen NO STANDARD PAGE HEADING.

    *Store where the queen is
    DATA: BEGIN OF row ,
               val TYPE i,
             END OF row .
    DATA: i_row LIKE row OCCURS 0 WITH HEADER LINE .

    *How many ways we can achieve
    DATA: oktimes TYPE i .
    data: queen type i.

    *Define the number of queen
    CONSTANTS: queenmax TYPE i VALUE 8 .

    *Input queen number
    PARAMETERS: p_num TYPE i DEFAULT queenmax.

    START-OF-SELECTION .
      PERFORM main_process .

    *&---------------------------------------------------------------------*
    *& Form MAIN_PROCESS
    *&---------------------------------------------------------------------*
    * text
    *----------------------------------------------------------------------*

    FORM main_process .
      DATA: l_num TYPE i . "The first place
      DATA: l_s(50) TYPE c . "Output string
      DATA: l_time(10) TYPE c.

      queen = p_num + 1.
    * Init place table
      DO queenmax TIMES .
        i_row-val = -1 .
        APPEND i_row .
      ENDDO.
      l_num = 1 .
    * recursion
      PERFORM place_queen USING l_num.

    * Get ways of algorithm

      l_time = oktimes .
      CONDENSE l_time .
      CONCATENATE 'Eight Queens have' l_time 'ways to solve it.' INTO l_s
      SEPARATED BY space.
      WRITE: l_s .
    ENDFORM. " MAIN_PROCESS
    *&---------------------------------------------------------------------*
    *& Form place_queen
    *&---------------------------------------------------------------------*
    * text
    *----------------------------------------------------------------------*

    FORM place_queen USING p_num.
    * Local data definition
      DATA: l_i TYPE i .
      DATA: l_num TYPE i .
    * Temp variants
      DATA: l_k TYPE i .
      DATA: l_t1 TYPE i .
      DATA: l_t2 TYPE i .

    * Safe place
      DATA: BEGIN OF qsave OCCURS 0 ,
        val TYPE i ,
      END OF qsave .

    * Init safe place, make all place be safe
      DO queenmax TIMES .
        qsave-val = 1 .
        APPEND qsave .
      ENDDO.

      l_i = 1 .
      l_num = p_num .

    * This loop get the safe place
      WHILE l_i < l_num .
        READ TABLE i_row INDEX l_i .
        READ TABLE qsave INDEX i_row-val .
        qsave-val = 0 .
        MODIFY qsave INDEX i_row-val.

        l_k = l_num - l_i .
        l_t1 = i_row-val + l_k .
        l_t2 = i_row-val - l_k .

    * Mark safe place
    * If a queen's place is I_ROW[i]=j, then the unsafe place is row k column j
    * and column j+k-i and j-k+i

        IF l_t1 >= 1 AND l_t1 < queen .
          READ TABLE qsave INDEX l_t1 .
          qsave-val = 0 .
          MODIFY qsave INDEX l_t1 .
        ENDIF.

        IF l_t2 >= 1 AND l_t2 < queen .
          READ TABLE qsave INDEX l_t2 .
          qsave-val = 0 .
          MODIFY qsave INDEX l_t2 .
        ENDIF.
        l_i = l_i + 1 .
      ENDWHILE .

      l_i = 1 .
    * Below loop is to get the queen's place
      WHILE l_i < queen .
        READ TABLE qsave INDEX l_i .
        IF qsave-val = 0 .
    * If this place is not safe, then get the next place
          l_i = l_i + 1 .
          CONTINUE .
        ENDIF.

    * if not the last place
        IF p_num < queenmax.
          READ TABLE i_row INDEX p_num .
          i_row-val = l_i .
          MODIFY i_row INDEX p_num .
          l_num = p_num + 1 .
    * Get the next queen's place
          PERFORM place_queen USING l_num .
        ELSE .
    * The last queen, give her the last place
          READ TABLE i_row INDEX p_num .
          i_row-val = l_i .
          MODIFY i_row INDEX p_num.
    * The ways of place add 1 and output
          oktimes = oktimes + 1 .
          WRITE: '--------------------------------------------------------------------------------',/.
          LOOP AT i_row .
            WRITE: i_row-val .
          ENDLOOP .
          WRITE: / .
        ENDIF.
        l_i = l_i + 1 .
      ENDWHILE .
    ENDFORM. " PLACE_QUEEN

  • 相关阅读:
    若依项目上传下载附件实现
    若依项目实现导入功能
    若依项目开发实践
    若依项目人员选择器实现
    springboot打成Jar包后部署至Linux服务器上
    linux下启动tomcat----Cannot find ./catalina.sh
    Linux下更换jdk和配置环境变量
    若依项目分模块集成uflo2
    若依项目模块化开发
    Java中涉及到金额业务的处理
  • 原文地址:https://www.cnblogs.com/wequst/p/1513895.html
Copyright © 2011-2022 走看看