找回密码
 欢迎注册
查看: 1027|回复: 26

[转载] 指定区块和为素数的数独问题

[复制链接]
发表于 2023-8-31 09:42:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
这是德国谜题网站LMD上的一道题。

规则和条件如下:
标准数独规则:每行,每列,每宫数字不重复且仅限1-9数字
附加条件:每个虚框内的数字不重复且和值是一个素数。

这道题的标题叫“原始本能(Primal Instinct)”
作者: Agent

不是很清楚作者为何给这题取这个名字。
解决这个问题会有些棘手,甚至会产生想放弃,逃避的念头,也是这就是人的一种本能。

但这道题提交正确答案的人相对比较多,且都对此题有比较高的评价。
对自己有自信的人,是不会在众多人面前露怯的,也许,这也算是人的一种本能。
831.png

评分

参与人数 1威望 +16 金币 +16 贡献 +16 经验 +16 鲜花 +16 收起 理由
northwolves + 16 + 16 + 16 + 16 + 16 不错的题目!中左似乎是个突破口.

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-8-31 15:26:43 | 显示全部楼层
嗯,中左的第4宫比较容易吸引眼球。但不能过度依赖。有蛮多人反映,尽管自己看上了第4宫,但还是折腾我好辛苦,言下之意就是,看MM,不能太专一。哈哈
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-1 07:55:16 | 显示全部楼层
刚才简单测试了一下,满足第4宫的1-9有1728种排列。

点评

被卡以后,回头望去,会发现在该拐弯的路口,都有路标竖着,只是你自己漏了。不是因为自己眼力不好,而是因为自己数字不敏感...  发表于 2023-9-1 08:45
重点不在于排列数的多少。解这题的重点在于,素数在不同的环境下能给你提供多少线索,然后你根据这些线索按图索骥。解这题的时候,我也有返...  发表于 2023-9-1 08:41
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-1 07:58:02 | 显示全部楼层
第4,5,6,3宫联合判断可能会剪一大部分

点评

数独属于一种纸笔谜题,解题都是有迹可循的。无论是制作还是解答都有强调想象力和创造力。这题作者本人给出4星难度。答题者综合评价97%  发表于 2023-9-1 08:37
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-1 14:12:33 | 显示全部楼层
先给四宫一点面子。
这三个单格肯定没有2,它们会占用3,5,7三个数。

有兴趣的,可以一起来玩玩这道题。
901.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-1 21:18:07 | 显示全部楼层
来个跳跃,给点信心。

俺第一个能确定的具体数字是这个2.
901.2.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-2 09:30:32 | 显示全部楼层
谜题通常玩的是灵感,灵感会照亮你的生活,令你兴奋,激动...

凭着那一丝灵感,这道题会显得格外简单...
902.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-2 10:48:25 | 显示全部楼层
穷举出来了,比较奇怪的是比较快的搜索方案是在搜完左中后,继续左下左上可以更快而不是中中,右中更快。
左中第一行为7,5,8

点评

你的编程水平很高。我发一道有点“颠覆性”的题,你看看  发表于 2023-9-2 11:02
从直观的角度说,开局阶段,4宫最多能确定一个7,更多的确定结果会在下中右,也就是8,9宫,它们至少能确定8,9个数字。  发表于 2023-9-2 11:01
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-2 15:50:12 | 显示全部楼层
代码产生穷举代码,然后大概需要运行20分钟
  1. #include <stdio.h>
  2. #include <string.h>

  3. typedef struct PL{
  4.     int len;
  5.     char *data;
  6. }PL;

  7. PL pls[]={
  8.         {2,"1112"},
  9.         {1,"13"},
  10.         {4,"14151617"},
  11.         {3,"182838"},
  12.         {4,"19293949"},
  13.         {3,"212231"},
  14.         {5,"2324323334"},
  15.         {2,"2737"},
  16.         {2,"3536"},
  17.         {1,"41"},
  18.         {1,"42"},
  19.         {3,"435253"},
  20.         {2,"4445"},
  21.         {2,"4656"},
  22.         {2,"4748"},
  23.         {1,"51"},
  24.         {2,"5758"},
  25.         {2,"5969"},
  26.         {3,"616263"},
  27.         {3,"646566"},
  28.         {2,"6768"},
  29.         {4,"71727374"},
  30.         {1,"75"},
  31.         {3,"767778"},
  32.         {5,"7987888999"},
  33.         {7,"81828393949596"},
  34.         {3,"848586"},
  35.         {1,"91"},
  36.         {1,"92"}
  37. };
  38. #define PLSN (sizeof(pls)/sizeof(pls[0]))
  39. int sorder[9]={3,6,0,7,8,4,5,2,1};

  40. #define NUMSET (PLSN+3*9)
  41. __int128_t allsets[NUMSET];

  42. void initallsets()
  43. {
  44.     int i,j;
  45.     for(i=0;i<PLSN;i++){
  46.         __int128_t r=0;
  47.         for(j=0;j<pls[i].len;j++){
  48.             int row=pls[i].data[2*j]-'1';
  49.             int col=pls[i].data[2*j+1]-'1';
  50.             int index=row*9+col;
  51.             __int128_t x=1;
  52.             x<<=index;
  53.             r|=x;
  54.         }
  55.         allsets[i]=r;
  56.     }
  57.     for(i=0;i<9;i++){//rows
  58.         __int128_t r=0;
  59.         for(j=0;j<9;j++){
  60.              __int128_t x=1;
  61.              x<<=i*9+j;
  62.              r|=x;
  63.         }
  64.         allsets[PLSN+i]=r;
  65.     }
  66.     for(i=0;i<9;i++){
  67.         __int128_t r=0;
  68.         for(j=0;j<9;j++){
  69.             __int128_t x=1;
  70.             x<<=i+j*9;
  71.             r|=x;
  72.         }
  73.         allsets[PLSN+9+i]=r;
  74.     }
  75.     for(i=0;i<9;i++){
  76.         __int128_t r=0;
  77.         for(j=0;j<9;j++){
  78.             __int128_t x=1;
  79.             x<<=((i%3)*3+(j%3))*9+((i/3)*3+(j/3));
  80.             r|=x;
  81.         }
  82.         allsets[PLSN+18+i]=r;
  83.     }
  84. }

  85. int main()
  86. {
  87.     FILE *f=fopen("tmpsudk.c","w");
  88.     int i,j,k,s;
  89.     __int128_t r=0;
  90.     initallsets();
  91.     fprintf(f,"#include <stdio.h>\n");
  92.     fprintf(f,"int mset[%d];\n",(int)NUMSET);
  93.     fprintf(f,"char blocks[81];\n");
  94.     fprintf(f,"int isprime(int x){return (x==2||x==3||x==5||x==7||x==11||x==13||x==17||x==19||x==23||x==29||x==31||x==37||x==41);}\n");
  95.     fprintf(f,"void output(){\n");
  96.     fprintf(f,"int i;\n");
  97.     fprintf(f,"for(i=0;i<81;i++){\n");
  98.     fprintf(f,"printf("%%d,",blocks[i]);\n");
  99.     fprintf(f,"if(i%%9==8)printf("\\n");\n");
  100.     fprintf(f,"}\n\nprintf("\\n");fflush(stdout);\n}\n\n");
  101.     fprintf(f,"int main()\n");
  102.     fprintf(f,"{\n");
  103.     fprintf(f,"int ");
  104.     for(i=0;i<81;i++)fprintf(f,"i%d,s%d,",i,i);
  105.     fprintf(f,"s;\n");
  106.     for(i=0;i<9;i++){
  107.         int bb=sorder[i];
  108.         int brow=(bb/3)*3,bcol=(bb%3)*3;
  109.         for(j=0;j<3;j++)for(k=0;k<3;k++){
  110.             int bid=(brow+j)*9+(bcol+k);
  111.             fprintf(f,"for(i%d=1;i%d<=9;i%d++){\n",bid,bid,bid);
  112.             for(s=0;s<NUMSET;s++){
  113.                 if((allsets[s]>>bid)&1){
  114.                     fprintf(f,"if((mset[%d]>>i%d)&1)continue;\n",s,bid);
  115.                 }
  116.             }
  117.             fprintf(f,"blocks[%d]=i%d;\n",bid,bid);
  118.             __int128_t x=1;x<<=bid;
  119.             r|=x;
  120.             for(s=0;s<PLSN;s++){
  121.                 if(((allsets[s]>>bid)&1) && (r&allsets[s])==allsets[s]){//reach the set
  122.                     fprintf(f,"s=0;\n");
  123.                     __int128_t y=1;
  124.                     int t;
  125.                     for(t=0;t<128;t++){
  126.                         if(allsets[s]&y){
  127.                             fprintf(f,"s+=blocks[%d];\n",t);
  128.                         }
  129.                         y<<=1;
  130.                     }
  131.                     fprintf(f,"if(!isprime(s))continue;\n");
  132.                 }
  133.             }
  134.             if(i==8&&j==2&&k==2){
  135.                 fprintf(f,"output();\n");
  136.             }
  137.             //set of mset
  138.             for(s=0;s<NUMSET;s++){
  139.                 if((allsets[s]>>bid)&1){
  140.                     fprintf(f,"mset[%d]|=1<<i%d;\n",s,bid);
  141.                 }
  142.             }
  143.         }
  144.     }

  145.     for(i=8;i>=0;i--){
  146.         int bb=sorder[i];
  147.         int brow=(bb/3)*3,bcol=(bb%3)*3;
  148.         for(j=2;j>=0;j--)for(k=2;k>=0;k--){
  149.             int bid=(brow+j)*9+(bcol+k);
  150.             for(s=0;s<NUMSET;s++){
  151.                 if((allsets[s]>>bid)&1){
  152.                     fprintf(f,"mset[%d]&=~(1<<i%d);\n",s,bid);
  153.                 }
  154.             }
  155.             fprintf(f,"}//i%d\n",bid);
  156.         }
  157.     }
  158.     fprintf(f,"}\n");
  159.     fclose(f);
  160.     return 0;
  161. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-3 07:31:19 | 显示全部楼层
高手解这题能在30分钟内解决。

此题的纸笔解题的过程之一:
903-1.png
903-2.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-7 08:45 , Processed in 0.105889 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表