一个跳舞题目的Haskell解答[未完成]

m个舞者和n和领舞者跳舞

规则1:舞者不能和同一个领舞者跳两次以上

规则2:舞者不能跳同一个舞曲一次以上

求出所有组合


import Data.List
{-领舞者-}
type Leader = String
{-舞蹈-}
type Daunce = String
{-跳舞卡片-}
data Card = Card{leader::String
				,daunce::String} deriving (Eq,Show)
{-舞者-}
data Follower = Follower{name::String
						,cards::[Card]}deriving (Eq,Show)

rNoRepeatDaunce::Follower->Card->Bool
rNoRepeatDaunce (Follower _ []) _ = True
rNoRepeatDaunce (Follower _ cards) (Card _ d) = (find (==d) (map daunce cards))==Nothing

rNoEnoughLeader::[Card]->Leader->Bool
rNoEnoughLeader [] _ = True
rNoEnoughLeader cards leader' = let  leaders = map leader cards 
								in 
									let count = sum $ [1 | l<-leaders, l== leader']
									in 
										if count ==2
										then False
										else True
rOneDaunce::Follower->Daunce->Bool
rOneDaunce (Follower _ cards) d = [ 1 | (Card _ daunce) <-cards,daunce==d] == []
							

removeLeader::[Card]->Leader->[Card]
removeLeader [] _ = []
removeLeader  lds l = [  ld | ld@(Card leader daunce) <- lds , l /= leader]

removeCards::[Card]->[Card]->[Card]
removeCards lwd o = filter (\x -> (x `elem` o)==False) lwd

append :: Follower->Card->Follower
append (Follower name cards) t@(Card leadername daunce)= Follower name  (t:cards)
							
tDauncers=["Tom","Peter"]
tLeaders=["Candy"]
tDaunces=["waltz"]

leaderWithDaunceLst = [Card l d | l <- tLeaders,d <- tDaunces]
follows = [Follower name [] | name <-tDauncers]

allDaunce::[Follower]->[Card]
allDaunce [] = []
allDaunce ((Follower _ ds ):xs) = ds ++ (allDaunce xs)

comPair::[Follower]->[Follower]->[Card]->[Follower]
comPair ds o [] = ds++o
comPair ds [] _ = ds
comPair r (f:fx) t@(card@(Card leader daunce):cardList) = if (rNoRepeatDaunce f card) 
													  && (rNoEnoughLeader (cards f) leader) 
													  && (rOneDaunce f daunce)
													 then comPair ((append f card):r) fx (removeLeader cardList leader)
													 else comPair r (f:fx) t
main = do
		a <- return $ comPair[] follows leaderWithDaunceLst
		putStrLn $ "step1:\t" ++ show a
		
		--f1 <- return  $ removeCards leaderWithDaunceLst $ allDaunce a
		b <- return $ comPair [] a leaderWithDaunceLst
		putStrLn $ "step2:\t" ++ show b
		
		f2 <- return  $ removeCards leaderWithDaunceLst $ allDaunce b
		c <- return $ comPair [] b f2
		putStrLn $ "step3:\t" ++ show c


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值