| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- N = 8 -- board size
- -- check whether position (n,c) is free from attacks
- local function isplaceok(a, n, c)
- for i = 1, n - 1 do -- for each queen already placed
- if (a[i] == c) or -- same column?
- (a[i] - i == c - n) or -- same diagonal?
- (a[i] + i == c + n) then -- same diagonal?
- return false -- place can be attacked
- end
- end
- return true -- no attacks; place is OK
- end
- -- print a board
- local function printsolution(a)
- for i = 1, N do -- for each row
- for j = 1, N do -- and for each column
- -- write "X" or "-" plus a space
- io.write(a[i] == j and "X" or "-", " ")
- end
- io.write("\n")
- end
- io.write("\n")
- end
- local function reverse(a, s, e)
- for i = s, e / 2 do
- local counter_i = e - (i - 1)
- local tmp = a[i]
- a[i] = a[counter_i]
- a[counter_i] = tmp
- end
- end
- local function generatePermutations()
- local p1 = { 1, 2, 3, 4, 5, 6, 7, 8}
- local ps = {p1}
- while true do
- local newP = {}
- local last_p = ps[#ps]
- for i = 1, #last_p do
- newP[i] = last_p[i]
- end
- local k = nil
- for i = #newP, 1, -1 do
- if newP[i + 1] == nil then
- goto continue
- end
- if newP[i] < newP[i + 1] then
- k = i
- break
- end
- ::continue::
- end
- if k == nil then
- break
- end
- local l = nil
- for i = #newP, 1, -1 do
- if newP[k] < newP[i] then
- l = i
- break
- end
- end
- if l == nil then
- print("ERROR: l was nil")
- os.exit(1)
- end
- local tmp = newP[k]
- newP[k] = newP[l]
- newP[l] = tmp
- reverse(newP, k + 1, #newP)
- print(k, l)
- table.insert(ps, newP)
- end
- return ps
- end
- local perms = generatePermutations()
- for i = 1, #perms do
- print(table.unpack(perms[i]))
- end
- print(#perms)
|