[转]Eight Queens algorithm With ABAP
2009-06-30 13:06
423 查看
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
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
相关文章推荐
- 递归算法计算八皇后问题(Eight Queen Problem with Recursive Algorithm)
- 8 Queens Solution with Genetic Algorithm
- 回溯法·递归 - 八皇后问题 Eight queens puzzle
- generation of solution manager key with ABAP
- ABAP - 3D Graphs with SAP
- MATLAB: 3d reconstruction using eight point algorithm
- 【Error处理】ABAP中调用Function Module出现“not begin with Function-Pool”错误
- A new boosting algorithm for improved time-series forecasting with recurrent neural networks
- ABAP函数:SD_VBAP_READ_WITH_VBELN(根据销售订单读取表vbap中的信息)
- Codeforces Beta Round #95 (Div. 2) -- E. Yet Another Task with Queens(STL)
- MST implementation with Kruskal and Boruvka algorithm
- CSharp Algorithm - Replace multiplication operator with a method
- Algorithm,dfs,N Queens Problem,N皇后,8皇后
- The installer cannot read the mwinstall.dll file, This is probably due to a CD reader which can only read files with an eight.th
- Algorithm: Reverse a Integer to an array with recursion
- Informatica PowerConnect for SAP R3——Integrating with SAP Using ABAP
- ABAP的READ TABLE with key后语句不能使用不等于号
- Reducing the Dimensionality of data with neural networks / A fast learing algorithm for deep belief net
- ABAP - 3D Graphs with SAP
- Solution to Maximum Subarray in linear-time algorithm with time complexity is O(n)