RosettaCodeData/Task/N-queens-problem/Elixir/n-queens-problem.elixir

39 lines
1 KiB
Text
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
defmodule RC do
2016-12-05 22:15:40 +01:00
def queen(n, display \\ true) do
solve(n, [], [], [], display)
2015-11-18 06:14:39 +00:00
end
2016-12-05 22:15:40 +01:00
defp solve(n, row, _, _, display) when n==length(row) do
if display, do: print(n,row)
2015-11-18 06:14:39 +00:00
1
end
2016-12-05 22:15:40 +01:00
defp solve(n, row, add_list, sub_list, display) do
2015-11-18 06:14:39 +00:00
Enum.map(Enum.to_list(0..n-1) -- row, fn x ->
2016-12-05 22:15:40 +01:00
add = x + length(row) # \ diagonal check
sub = x - length(row) # / diagonal check
if (add in add_list) or (sub in sub_list) do
2015-11-18 06:14:39 +00:00
0
2016-12-05 22:15:40 +01:00
else
solve(n, [x|row], [add | add_list], [sub | sub_list], display)
2015-11-18 06:14:39 +00:00
end
2016-12-05 22:15:40 +01:00
end) |> Enum.sum # total of the solution
2015-11-18 06:14:39 +00:00
end
2016-12-05 22:15:40 +01:00
defp print(n, row) do
IO.puts frame = "+" <> String.duplicate("-", 2*n+1) <> "+"
2015-11-18 06:14:39 +00:00
Enum.each(row, fn x ->
line = Enum.map_join(0..n-1, fn i -> if x==i, do: "Q ", else: ". " end)
IO.puts "| #{line}|"
end)
IO.puts frame
end
end
Enum.each(1..6, fn n ->
IO.puts " #{n} Queen : #{RC.queen(n)}"
end)
2016-12-05 22:15:40 +01:00
Enum.each(7..12, fn n ->
IO.puts " #{n} Queen : #{RC.queen(n, false)}" # no display
end)