{"id":393,"date":"2026-03-06T23:52:20","date_gmt":"2026-03-06T23:52:20","guid":{"rendered":"https:\/\/hackcuba.net\/?p=393"},"modified":"2026-03-06T23:53:18","modified_gmt":"2026-03-06T23:53:18","slug":"algoritmo-para-representar-un-sudoku","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=393","title":{"rendered":"Algoritmo para representar un Sudoku"},"content":{"rendered":"\n<p>Nos hemos tomado la libertad de publicar un c\u00f3digo sin el consentimiento previo del autor, del cual desconocemos su procedencia. No tuvimos tiempo de contactarlo, debido a que esperamos hasta el \u00faltimo minuto a que los lectores de la revista nos enviaran su propio algoritmo, como hab\u00edamos sugerido en <strong>BlackHat 16<\/strong>. Pero no se preocupen, que avisaremos lo m\u00e1s pronto posible a dicho programador para que nos d\u00e9 su consentimiento.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>El hecho es que en la secci\u00f3n de Ocio de la edici\u00f3n #14 de <strong>BlackHat<\/strong>, comenzamos a hacer p\u00fablico un conjunto de tableros del Sudoku, generados por el GNU Sudoku Portable -y redise\u00f1ados por nustro equipo. En ese mismo n\u00famero de la revista pensamos en tres reglas que pudieran ser aplicadas para la generaci\u00f3n de un algoritmo eficiente que permitiera resolver todos los pasos iniciales de este juego matem\u00e1tico. Volvemos a repetir dichas propuestas y a continuaci\u00f3n el c\u00f3digo que permite resolver la primera de ellas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Llenar de n\u00fameros una matriz 9&#215;9 donde se cumplan las reglas del juego.<\/li>\n\n\n\n<li>Hallar el m\u00e1ximo de n\u00fameros que se pueden ocultar para que no existan soluciones ambiguas.<\/li>\n\n\n\n<li>Seleccionar arbitrariamente las posiciones de los n\u00fameros que se van a ocultar para que exista una sola soluci\u00f3n.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;conio.h&gt;\n#include &lt;time.h&gt;\n#include &lt;iostream.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;math.h&gt;\n\nint a&#x5B;9]&#x5B;9], b&#x5B;9]&#x5B;9];\n\nbool Verif_cuadros(int grupo){\n  int posic, i;\n  bool acepto;\n  acepto= true;\n  for (posic=1; posic&lt;10; posic++) {\n    for (i=1; i&lt;posic; i++) {\n      if (b&#x5B;grupo]&#x5B;posic]==b&#x5B;grupo]&#x5B;i]) {\n        acepto=false;\n        goto sali;\n      }\n    }\n  }\n  sali: return acepto;\n}\n\nvoid Mezclar(){\n  int restoX, restoY;\n  int subir, t, x, y;\n  float X, Y;\n  int grupo, posic;\n  bool repet, acepta;\n  srand((unsigned)time(NULL));\n  for (y=1; y&lt;10; y++) {\n    for (x=1; x&lt;10; x++) {\n      a&#x5B;y]&#x5B;x]= (rand()%9) + 1;\n      for (t=1; t&lt;x; t++) {\n        if (a&#x5B;y]&#x5B;x]==a&#x5B;y]&#x5B;t]) repet=true;\n      }\n      if (repet==false) {\n        for (t=1; t&lt;y; t++) {\n          if (a&#x5B;y]&#x5B;x]==a&#x5B;t]&#x5B;x]) repet=true;\n        }\n      }\n      if (repet==true){\n        repet=false;\n        if (subir&gt; 20){\n          subir= 0;\n          x= 0;\n        }\n        else {\n          subir++;\n          x--;\n        }\n      }\n      else {\n        restoY= y % 3;\n        restoX= x % 3;\n        if (restoX==0) restoX=3;\n        if (restoY==0) restoY=3;\n        Y= y; X= x;\n        posic= 3*(restoY-1) + restoX;\n        grupo= 3*(ceil(Y\/3)-1) + ceil(X\/3);\n        b&#x5B;grupo]&#x5B;posic]= a&#x5B;y]&#x5B;x];\n        subir= 0;\n      }\n    }\n    if ((y%3)==0) {\n      for (grupo=y-2; grupo&lt;=y; grupo++){\n        acepta= Verif_cuadros(grupo);\n        if (acepta==false) {\n          y= y-3;\n          goto sali;\n        }\n      }\n    }\n    sali:;\n  }\n}\n\nvoid Imprimir(){\n  int y, x;\n  for (y=1; y&lt;10; y++) {\n    for (x=1; x&lt;10; x++) {\n      cout &lt;&lt; a&#x5B;y]&#x5B;x] &lt;&lt; &quot; &quot;;\n    }\n    cout &lt;&lt; endl;\n  }\n}\n\nvoid main(){\n  Mezclar();\n  Imprimir();\n  getch();\n}\n<\/pre><\/div>\n\n\n<p>Escrito por Ezequiel Hernandez<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nos hemos tomado la libertad de publicar un c\u00f3digo sin el consentimiento previo del autor, del cual desconocemos<\/p>\n","protected":false},"author":2,"featured_media":394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,36],"tags":[60,88,38,133],"class_list":["post-393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-proyecto-blackhat","tag-c","tag-codigos","tag-proyecto-blackhat","tag-soduko"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=393"}],"version-history":[{"count":2,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/393\/revisions"}],"predecessor-version":[{"id":397,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/393\/revisions\/397"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/394"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}