-
Notifications
You must be signed in to change notification settings - Fork 138
/
queens_r.pir
115 lines (106 loc) · 2.18 KB
/
queens_r.pir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Copyright (C) 2005-2009, Parrot Foundation.
# recursive queens placement
# prints all 92 solutions in chess notation
# by leo
.sub main :main
.local pmc queen_row, queen_state
queen_row = new 'ResizableIntegerArray'
queen_state = new 'ResizableIntegerArray'
solve(0, queen_row, queen_state)
.end
.sub solve
.param int row
.param pmc queen_row
.param pmc queen_state
.local int col, is_free
col = 0
loop:
is_free = check_free(col, row, queen_state)
unless is_free goto not_free
place_queen(col, row, queen_row, queen_state)
if row < 7 goto not_fin
print_solution(queen_row)
goto fin
not_fin:
$I0 = row + 1
solve($I0, queen_row, queen_state)
fin:
remove_queen(col, row, queen_row, queen_state)
not_free:
inc col
if col < 8 goto loop
.end
# queen_state
# 0..7 columns
# 8..14 first diagonal := col + row
# 24.. second diagonal := col - row
.sub check_free
.param int col
.param int row
.param pmc queen_state
$I0 = queen_state[col]
if $I0 goto ret_0
$I1 = col + row
$I1 += 8
$I0 = queen_state[$I1]
if $I0 goto ret_0
$I1 = col - row
$I1 += 32
$I0 = queen_state[$I1]
if $I0 goto ret_0
.return(1)
ret_0:
.return(0)
.end
.sub place_queen
.param int col
.param int row
.param pmc queen_row
.param pmc queen_state
$I0 = row + 1
set_queen(col, row, queen_row, queen_state, $I0)
.end
.sub remove_queen
.param int col
.param int row
.param pmc queen_row
.param pmc queen_state
set_queen(col, row, queen_row, queen_state, 0)
.end
.sub set_queen
.param int col
.param int row
.param pmc queen_row
.param pmc queen_state
.param int val
queen_row[col] = val
queen_state[col] = val
$I1 = col + row
$I1 += 8
queen_state[$I1] = val
$I1 = col - row
$I1 += 32
queen_state[$I1] = val
.end
.sub print_solution
.param pmc queen_row
.local int c, r
c = 0
loop:
$I0 = 65 + c
$S0 = chr $I0
print $S0
r = queen_row[c]
r += 48
$S0 = chr r
print $S0
print " "
inc c
if c < 8 goto loop
print "\n"
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: