{"id":4079,"date":"2018-05-16T06:00:00","date_gmt":"2018-05-16T04:00:00","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4079"},"modified":"2018-05-23T05:30:35","modified_gmt":"2018-05-23T03:30:35","slug":"problema-del-domino","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/problema-del-domino\/","title":{"rendered":"Problema del domin\u00f3"},"content":{"rendered":"<p>Las fichas del domin\u00f3 se pueden representar por pares de n\u00fameros enteros. El problema del domin\u00f3 consiste en colocar todas las fichas de una lista dada de forma que el segundo n\u00famero de cada ficha coincida con el primero de la siguiente.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   domino :: [(Int,Int)] -> [[(Int,Int)]]\n<\/pre>\n<p>tal que (domino fs) es la lista de las soluciones del problema del domin\u00f3 correspondiente a las fichas fs. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> domino [(1,2),(2,3),(1,4)]\n   [[(4,1),(1,2),(2,3)],[(3,2),(2,1),(1,4)]]\n   \u03bb> domino [(1,2),(1,1),(1,4)]\n   [[(4,1),(1,1),(1,2)],[(2,1),(1,1),(1,4)]]\n   \u03bb> domino [(1,2),(3,4),(2,3)]\n   [[(1,2),(2,3),(3,4)]]\n   \u03bb> domino [(1,2),(2,3),(5,4)]\n   []\n   \u03bb> domino [(x,y) | x <- [1..2], y <- [x..2]]\n   [[(2,2),(2,1),(1,1)],[(1,1),(1,2),(2,2)]]\n   \u03bb> [(x,y) | x <- [1..3], y <- [x..3]]\n   [(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]\n   \u03bb> mapM_ print (domino [(x,y) | x <- [1..3], y <- [x..3]])\n   [(1,3),(3,3),(3,2),(2,2),(2,1),(1,1)]\n   [(1,2),(2,2),(2,3),(3,3),(3,1),(1,1)]\n   [(2,2),(2,3),(3,3),(3,1),(1,1),(1,2)]\n   [(3,3),(3,2),(2,2),(2,1),(1,1),(1,3)]\n   [(2,3),(3,3),(3,1),(1,1),(1,2),(2,2)]\n   [(2,1),(1,1),(1,3),(3,3),(3,2),(2,2)]\n   [(3,3),(3,1),(1,1),(1,2),(2,2),(2,3)]\n   [(3,2),(2,2),(2,1),(1,1),(1,3),(3,3)]\n   [(3,1),(1,1),(1,2),(2,2),(2,3),(3,3)]\n   \u03bb> length (domino [(x,y) | x <- [1..3], y <- [x..3]])\n   9\n   \u03bb> length (domino [(x,y) | x <- [1..4], y <- [x..4]])\n   0\n   \u03bb> length (domino [(x,y) | x <- [1..5], y <- [x..5]])\n   84480\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport I1M.BusquedaEnEspaciosDeEstados (buscaEE)\nimport Data.List (delete)\n\n-- 1\u00aa soluci\u00f3n (por b\u00fasqueda en anchura)\n-- =====================================\n\n-- Las fichas son pares de n\u00fameros enteros.\ntype Ficha  = (Int,Int)\n\n-- Un problema est\u00e1 definido por la lista de fichas que hay que colocar\ntype Problema = [Ficha]\n\n-- Los estados son los pares formados por la listas sin colocar y las\n-- colocadas. \ntype Estado = ([Ficha],[Ficha])\n\n-- (inicial p) es el estado inicial del problema p.\ninicial :: Problema -> Estado\ninicial p = (p,[])\n\n-- (es final e) se verifica si e es un estado final.\nesFinal :: Estado -> Bool\nesFinal (fs,_) = null fs \n\nsucesores :: Estado -> [Estado]\nsucesores (fs,[]) =\n  [(delete f fs, [f]) | f <- fs]\nsucesores (fs,n@((x,y):qs)) =\n  [(delete (u,v) fs,(u,v):n) | (u,v) <- fs, u \/= v, v == x] ++\n  [(delete (u,v) fs,(v,u):n) | (u,v) <- fs, u \/= v, u == x] ++\n  [(delete (u,v) fs,(u,v):n) | (u,v) <- fs, u == v, u == x] \n\nsoluciones :: Problema -> [Estado]\nsoluciones p = busca [(inicial p)]\n  where\n    busca []        = []\n    busca (e:es)  \n      | esFinal e = e : busca es\n      | otherwise = busca (es ++ sucesores e)\n\ndomino :: Problema -> [[Ficha]]\ndomino ps = map snd (soluciones ps)\n      \n-- 2\u00aa soluci\u00f3n (por b\u00fasqueda en profundidad)\n-- =========================================\n\nsoluciones2 :: Problema -> [Estado]\nsoluciones2 p = busca [(inicial p)]\n  where\n    busca []        = []\n    busca (e:es)  \n      | esFinal e = e : busca es\n      | otherwise = busca (sucesores e ++ es)\n\ndomino2 :: Problema -> [[Ficha]]\ndomino2 ps = map snd (soluciones2 ps)\n      \n-- 3\u00aa soluci\u00f3n (con I1M.BusquedaEnEspaciosDeEstados)\n-- =================================================\n\ndomino3 :: Problema -> [[Ficha]]\ndomino3 ps = map snd (soluciones3 ps)\n\nsoluciones3 :: Problema -> [Estado]\nsoluciones3 ps = buscaEE sucesores\n                         esFinal         \n                         (inicial ps)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Las fichas del domin\u00f3 se pueden representar por pares de n\u00fameros enteros. El problema del domin\u00f3 consiste en colocar todas las fichas de una lista dada de forma que el segundo n\u00famero de cada ficha coincida con el primero de la siguiente. Definir la funci\u00f3n domino :: [(Int,Int)] -> [[(Int,Int)]] tal que (domino fs) es&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[4],"tags":[353,8,25,10,27,11,16],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4079"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=4079"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4079\/revisions"}],"predecessor-version":[{"id":4108,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4079\/revisions\/4108"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}