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

  • 相关阅读:
    【总结】进程和线程的区别
    为什么要求数据链路层帧的长度必须限制在一定范围内?
    常用正交表
    用正交表设计测试用例
    测试中的杀虫剂困境
    作品集-1:淘宝支付宝登陆框
    # 36氪开放日 • 杭州 • 11月10日 # 谈谈参会感受
    《在你身边,为你设计》读后感
    抱怨的背后
    更快的方式实现PHP数组去重
  • 原文地址:https://www.cnblogs.com/wequst/p/1513895.html
Copyright © 2011-2022 走看看