{"id":5049,"date":"2019-05-28T06:00:23","date_gmt":"2019-05-28T04:00:23","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5049"},"modified":"2021-04-25T12:39:27","modified_gmt":"2021-04-25T10:39:27","slug":"espacio-de-estados-del-problema-de-las-n-reinas-2019","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/espacio-de-estados-del-problema-de-las-n-reinas-2019\/","title":{"rendered":"Espacio de estados del problema de las N reinas"},"content":{"rendered":"<p>El problema de las N reinas consiste en colocar N reinas en  tablero rectangular de dimensiones N por N de forma que no se encuentren m\u00e1s de una en la misma l\u00ednea: horizontal, vertical o diagonal. Por ejemplo, una soluci\u00f3n para el problema de las 4 reinas es<\/p>\n<pre lang=\"text\"> \n   |---|---|---|---|\n   |   | R |   |   |\n   |---|---|---|---|\n   |   |   |   | R |\n   |---|---|---|---|\n   | R |   |   |   |\n   |---|---|---|---|\n   |   |   | R |   |\n   |---|---|---|---|\n<\/pre>\n<p>Los estados del problema de las N reinas son los tableros con las reinas colocadas. Inicialmente el tablero est\u00e1 vac\u00edo y, en cda paso se coloca una reina en la primera columna en la que a\u00fan no hay ninguna reina.<\/p>\n<p>Cada estado se representa por una lista de n\u00fameros que indican las filas donde se han colocado las reinas. Por ejemplo, el tablero anterior se representa por [2,4,1,3].<\/p>\n<p>Usando la librer\u00eda de \u00e1rboles <a href=\"http:\/\/bit.ly\/2QrvaA8\">Data.Tree<\/a>, definir las funciones<\/p>\n<pre lang=\"text\"> \n   arbolReinas :: Int -> Tree [Int]\n   nEstados    :: Int -> Int\n   soluciones  :: Int -> [[Int]]\n   nSoluciones :: Int -> Int\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(arbolReinas n) es el \u00e1rbol de estados para el problema de las n reinas. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     \u03bb> putStrLn (drawTree (fmap show (arbolReinas 4)))\n     []\n     |\n     +- [1]\n     |  |\n     |  +- [3,1]\n     |  |\n     |  `- [4,1]\n     |     |\n     |     `- [2,4,1]\n     |\n     +- [2]\n     |  |\n     |  `- [4,2]\n     |     |\n     |     `- [1,4,2]\n     |        |\n     |        `- [3,1,4,2]\n     |\n     +- [3]\n     |  |\n     |  `- [1,3]\n     |     |\n     |     `- [4,1,3]\n     |        |\n     |        `- [2,4,1,3]\n     |\n     `- [4]\n        |\n        +- [1,4]\n        |  |\n        |  `- [3,1,4]\n        |\n        `- [2,4]\n     \n     \u03bb> putStrLn (drawTree (fmap show (arbolReinas 5)))\n     []\n     |\n     +- [1]\n     |  |\n     |  +- [3,1]\n     |  |  |\n     |  |  `- [5,3,1]\n     |  |     |\n     |  |     `- [2,5,3,1]\n     |  |        |\n     |  |        `- [4,2,5,3,1]\n     |  |\n     |  +- [4,1]\n     |  |  |\n     |  |  `- [2,4,1]\n     |  |     |\n     |  |     `- [5,2,4,1]\n     |  |        |\n     |  |        `- [3,5,2,4,1]\n     |  |\n     |  `- [5,1]\n     |     |\n     |     `- [2,5,1]\n     |\n     +- [2]\n     |  |\n     |  +- [4,2]\n     |  |  |\n     |  |  `- [1,4,2]\n     |  |     |\n     |  |     `- [3,1,4,2]\n     |  |        |\n     |  |        `- [5,3,1,4,2]\n     |  |\n     |  `- [5,2]\n     |     |\n     |     +- [1,5,2]\n     |     |  |\n     |     |  `- [4,1,5,2]\n     |     |\n     |     `- [3,5,2]\n     |        |\n     |        `- [1,3,5,2]\n     |           |\n     |           `- [4,1,3,5,2]\n     |\n     +- [3]\n     |  |\n     |  +- [1,3]\n     |  |  |\n     |  |  `- [4,1,3]\n     |  |     |\n     |  |     `- [2,4,1,3]\n     |  |        |\n     |  |        `- [5,2,4,1,3]\n     |  |\n     |  `- [5,3]\n     |     |\n     |     `- [2,5,3]\n     |        |\n     |        `- [4,2,5,3]\n     |           |\n     |           `- [1,4,2,5,3]\n     |\n     +- [4]\n     |  |\n     |  +- [1,4]\n     |  |  |\n     |  |  +- [3,1,4]\n     |  |  |  |\n     |  |  |  `- [5,3,1,4]\n     |  |  |     |\n     |  |  |     `- [2,5,3,1,4]\n     |  |  |\n     |  |  `- [5,1,4]\n     |  |     |\n     |  |     `- [2,5,1,4]\n     |  |\n     |  `- [2,4]\n     |     |\n     |     `- [5,2,4]\n     |        |\n     |        `- [3,5,2,4]\n     |           |\n     |           `- [1,3,5,2,4]\n     |\n     `- [5]\n        |\n        +- [1,5]\n        |  |\n        |  `- [4,1,5]\n        |\n        +- [2,5]\n        |  |\n        |  `- [4,2,5]\n        |     |\n        |     `- [1,4,2,5]\n        |        |\n        |        `- [3,1,4,2,5]\n        |\n        `- [3,5]\n           |\n           `- [1,3,5]\n              |\n              `- [4,1,3,5]\n                 |\n                 `- [2,4,1,3,5]\n<\/pre>\n<ul>\n<li>(nEstados n) es el n\u00famero de estados en el problema de las n reinas. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     nEstados 4            ==  17\n     nEstados 5            ==  54\n     map nEstados [0..10]  ==  [1,2,3,6,17,54,153,552,2057,8394,35539]\n<\/pre>\n<ul>\n<li>(soluciones n) es la lista de estados que son soluciones del problema de las n reinas. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     \u03bb> soluciones 4\n     [[3,1,4,2],[2,4,1,3]]\n     \u03bb> soluciones 5\n     [[4,2,5,3,1],[3,5,2,4,1],[5,3,1,4,2],[4,1,3,5,2],[5,2,4,1,3],\n      [1,4,2,5,3],[2,5,3,1,4],[1,3,5,2,4],[3,1,4,2,5],[2,4,1,3,5]]\n<\/pre>\n<ul>\n<li>(nSoluciones n) es el n\u00famero de soluciones del problema de las n reinas. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">   \n     nSoluciones 4            ==  2\n     nSoluciones 5            ==  10\n     map nSoluciones [0..10]  ==  [1,1,0,0,2,10,4,40,92,352,724]\n<\/pre>\n<h4>Soluciones<\/h4>\n<p>[schedule expon=&#8217;2019-06-04&#8242; expat=\u00bb06:00&#8243;]<\/p>\n<ul>\n<li>Las soluciones se pueden escribir en los comentarios hasta el 04 de junio.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nYa algunos pedagogos comienzan a comprender que los ni\u00f1os no deben ser educados como meros aprendices de hombre, que hay algo sagrado en la infancia para vivir plenamente por ella.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n<p>[\/schedule]<\/p>\n<p>[schedule on=&#8217;2019-06-04&#8242; at=\u00bb06:00&#8243;]<\/p>\n<pre lang=\"haskell\">\r\nimport Data.List ((\\\\))\r\nimport Data.Tree\r\n\r\n-- Definici\u00f3n de arbolReinas\r\n-- =========================\r\n\r\narbolReinas :: Int -> Tree [Int]\r\narbolReinas n = expansion n []\r\n  where\r\n    expansion m xs = Node xs [expansion (m-1) ys | ys <- sucesores n xs]\r\n\r\n-- (sucesores n xs) es la lista de los sucesores del estado xs en el\r\n-- problema de las n reinas. Por ejemplo,\r\n--    sucesores 4 []       ==  [[1],[2],[3],[4]]\r\n--    sucesores 4 [1]      ==  [[3,1],[4,1]]\r\n--    sucesores 4 [4,1]    ==  [[2,4,1]]\r\n--    sucesores 4 [2,4,1]  ==  []\r\nsucesores :: Int -> [Int] -> [[Int]]\r\nsucesores n xs = [y:xs | y <- [1..n] \\\\ xs\r\n                       , noAtaca y xs 1]\r\n\r\n-- (noAtaca y xs d) se verifica si la reina en la fila y no ataca a las\r\n-- colocadas en las filas xs donde d es el n\u00famero de columnas desde la\r\n-- de la posici\u00f3n de x a la primera de xs.\r\nnoAtaca :: Int -> [Int] -> Int -> Bool\r\nnoAtaca _ [] _ = True\r\nnoAtaca y (x:xs) distH = abs(y-x) \/= distH &&\r\n                         noAtaca y xs (distH + 1)               \r\n\r\n-- Definici\u00f3n de nEstados\r\n-- ======================\r\n\r\nnEstados :: Int -> Int\r\nnEstados = length . arbolReinas\r\n\r\n-- Definici\u00f3n de solucionesReinas\r\n-- ==============================\r\n\r\n--    \u03bb> soluciones 4\r\n--    [[3,1,4,2],[2,4,1,3]]\r\n--    \u03bb> soluciones 5\r\n--    [[4,2,5,3,1],[3,5,2,4,1],[5,3,1,4,2],[4,1,3,5,2],[5,2,4,1,3],\r\n--     [1,4,2,5,3],[2,5,3,1,4],[1,3,5,2,4],[3,1,4,2,5],[2,4,1,3,5]]\r\nsoluciones :: Int -> [[Int]]\r\nsoluciones n =\r\n  filter (\\xs -> length xs == n) (estados n)\r\n\r\n-- (estados n) es la lista de estados del problema de las n reinas. Por\r\n-- ejemplo, \r\n--   \u03bb> estados 4\r\n--   [[],\r\n--    [1],[2],[3],[4],\r\n--    [3,1],[4,1],[4,2],[1,3],[1,4],[2,4],\r\n--    [2,4,1],[1,4,2],[4,1,3],[3,1,4],\r\n--    [3,1,4,2],[2,4,1,3]]\r\nestados :: Int -> [[Int]]\r\nestados = concat . levels . arbolReinas\r\n\r\n-- Definici\u00f3n de nSoluciones\r\n-- =========================\r\n\r\nnSoluciones :: Int -> Int\r\nnSoluciones = length . soluciones\r\n<\/pre>\n<p>[\/schedule]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El problema de las N reinas consiste en colocar N reinas en tablero rectangular de dimensiones N por N de forma que no se encuentren m\u00e1s de una en la misma l\u00ednea: horizontal, vertical o diagonal. Por ejemplo, una soluci\u00f3n para el problema de las 4 reinas es |&#8212;|&#8212;|&#8212;|&#8212;| | | R | | |&#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":[2],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5049"}],"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=5049"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5049\/revisions"}],"predecessor-version":[{"id":5050,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5049\/revisions\/5050"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}