Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336095
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类:

2011-03-23 16:17:21

-- file:8q.hs

-- filter Line at x for current available queen
fL :: Int -> [(Int,Int)] -> [(Int,Int)]
fL i l =
 filter (\(x,y) -> x == i) l

-- filter blank points for next iteration
fA :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
fA (i,j) list =
 filter
  (\(x,y) -> (x /= i) && (y /= j) && ((abs (x-i)) /= (abs (y-j))))
  list

-- make a [(1,1)..(n,n)] full chess map
initList :: Int -> [(Int,Int)]
initList n = [(x,y) | x <- [1..n], y <- [1..n]]

-- iteration for results
nqueenIter :: Int -> Int -> [(Int,Int)] -> [[(Int,Int)]]
nqueenIter i n bl =
  if i == n then
    map (\x -> [x]) bl
  else
    concatMap
      (\q -> map (q:) (nqueenIter (i+1) n (fA q bl)))
      (fL i bl)

-- main function for a n-queen solution
nqueen :: Int -> [[(Int,Int)]]
nqueen n = nqueenIter 1 n (initList n)
阅读(1114) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~