找回密码
 欢迎注册
查看: 5354|回复: 5

[讨论] 海战棋的最佳策略

[复制链接]
发表于 2021-11-24 09:49:44 | 显示全部楼层 |阅读模式

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

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

×
海战棋是一个双人的非完全信息博弈,简单来说就是猜对方的船只在哪儿。

开战前双方在10乘10的格子阵中,摆放1搜长度为4的船只、2搜长度为3的船只、3搜长度为2的船只、4搜长度为1的船只,共计10艘船占20个格子。

摆放的船只不能紧邻(占领的格子不能有公共边),也不能对角相邻(占领的格子不能有公共点)。

这是一种可行的摆法(蓝色矩形表示船只):

pattern.png

双方都摆好后,就轮流轰炸对方阵地。

对于每轮轰炸,都是选择对方阵地中的1个格子进行轰炸,

如果轰炸的格子有船只,则可以继续另选格子进行轰炸,

直到轰炸的格子没有船只为止,本轮轰炸结束。

如果某艘船所占的格子都被轰炸过,则必须立即把这艘船亮出来,然后这艘船周围一圈的格子都无需再轰炸。

先把对方10艘船所占的20个格子都轰炸完的一方获胜。

在这个网站上,无需注册账号就可以玩这个游戏:

http://zh.battleship-game.org

本贴希望编程解决以下问题:

问题1:我方有多少种摆法?

问题2:分别以多大的概率选择每种摆法,可以使得对方轰炸的轮数的期望值达到最大(假设对方使用最佳策略轰炸)?

问题3:我方应如何轰炸对方阵地,可以使得轰炸所需轮数的期望值达到最小(假设对方使用最佳策略摆船)?

问题4:当双方都使用纳什均衡策略进行摆船和轰炸时,先手的胜率是多少?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2021-12-3 23:33:33 | 显示全部楼层
我从$2^6*10^20$种摆法中,随机抽取了$2240000000$种摆法进行判断,结果仅有$187391$种摆法是合规摆法,

因此可以估算出我方有$2^6*10^20*187391/2240000000\approx 5.354*10^17$种摆法。

这是按$10$艘船都不一样来计算的摆法数。

实际上有些船是一样的,所以摆法数没那么多。

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2021-12-17 11:01:21 | 显示全部楼层
這是一個紙筆遊戲,參見這個網站

這個遊戲的船隻數量有很多版本,樓主的那個版本比較少見,因為一個格子的船太多了。一個格子的比較難打中。

從遊戲設計的角度考慮,最需要測試的是,到底船隻數量及大小如何安排比較合理。大船容易被打中的同時,它也排除了週邊水域。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-8-26 15:53:35 | 显示全部楼层
我计算出来的状态数目是5429981475002236 (没有考虑旋转翻转等对称性),动态规划计算时间在10分钟左右,就是比较难验证代码的正确性。但是数目和Fans的估算还是偏差比较大,大概3倍关系。
程序可以顺便统计出最后一行状态的分布,比如
UC{ 4 3 2 1 } -20-21E  |21E  |32E  |32E  |43是22364483种
UC{ 4 3 2 1 } E  |21E  |21E  |32E  |32E  |43是18181372种,
其中UC {4 3 2 1}代表四种长度的船分别使用了4,3,2,1只。最后一行中E  代表这个格子是空的|21代表这个格子是一个竖排的船,长度为2,这个格子在船上编号从上到下为1(第一格编号为0)。-20-21代表一个横排的长度为2的船。

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-8-26 16:44:16 | 显示全部楼层
修正了一个bug,每个格子前面考虑了上面,左边,左上的格子,但是忘了考虑右上格子也必须空时才能非空。
修正后计算出来数目为2140733320018399,折算成Fans的估算数目约$6.165\times10^{17}$

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <map>
  4. #define N 10
  5. #define EMPT  0
  6. #define B1    1
  7. #define B2H   2
  8. #define B2L   3
  9. #define B3H   4
  10. #define B3L   5
  11. #define B4H   6
  12. #define B4L   7

  13. std::map<long,long> s2c[2];

  14. static char bsbits[4]={7,3,3,1};
  15. static char bsstart[4]={0,3,5,7};
  16. struct DS{
  17.         char uc[4];
  18.         char bs[N+1];
  19. };

  20. int getuc(long v, int bs)
  21. {

  22.         int r=(v>>55)&255;
  23.         return (r>>bsstart[bs])&bsbits[bs];
  24. }
  25. long setuc(long v,int bs, int s)
  26. {
  27.         int off=55+bsstart[bs];
  28.         v&=~(((1L<<bsbits[bs])-1)<<off);
  29.         v|=((long)s)<<off;
  30.         return v;
  31. }

  32. int getposstat(long v, int k)
  33. {
  34.         return (v>>(k*5))&31;
  35. }

  36. long setposstat(long v, int k, int s)
  37. {
  38.         int off=k*5;
  39.         v&=~(31L<<off);
  40.         v|=(long)s<<off;
  41.         return v;
  42. }

  43. int getstattype(int s)
  44. {
  45.         return (s>>2)&7;
  46. }
  47. int getstatoff(int s)
  48. {
  49.         return s&3;
  50. }

  51. int createstat(int type, int off)
  52. {
  53.         return (type<<2)|off;
  54. }

  55. void decode(long v, DS& ds)
  56. {
  57.         int i;
  58.         for(i=0;i<4;i++)ds.uc[i]=getuc(v,i);
  59.         for(i=0;i<N+1;i++)ds.bs[i]=getposstat(v,i);
  60. }

  61. long encode(const DS& ds)
  62. {
  63.         long v=0L;
  64.         int i;
  65.         for(i=0;i<4;i++)v=setuc(v,i,ds.uc[i]);
  66.         for(i=0;i<N+1;i++)v=setposstat(v,i,ds.bs[i]);
  67.         return v;
  68. }

  69. #define CS(t,o) createstat(t,o)
  70. void outds(const DS& ds)
  71. {
  72.         int i;
  73.         printf("UC{");
  74.         for(i=0;i<4;i++){printf(" %d", ds.uc[i]);}
  75.         printf(" } ");
  76.         for(i=0;i<N+1;i++){
  77.                 if(ds.bs[i]==CS(EMPT,0))printf("E  ");
  78.                 else printf("%c%d%d",getstattype(ds.bs[i])&1?'|':'-',getstattype(ds.bs[i])/2+1,getstatoff(ds.bs[i]));
  79.         }
  80.         printf("\n");
  81. }


  82. void init0()
  83. {
  84.         long x=0;//all empty
  85.         int i,j;
  86.         DS ds;
  87.         for(i=0;i<8;i++){//all 8 stattype
  88.                 ds.uc[0]=ds.uc[1]=ds.uc[2]=ds.uc[3]=0;
  89.                 for(j=0;j<N+1;j++)ds.bs[j]=0;
  90.                 int s = CS(i,0); //The first block in stat s
  91.                 x = 0;
  92.                 ds.bs[0]=s;
  93.                 if(i!=EMPT){
  94.                         int uc=i>>1;
  95.                         ds.uc[i>>1]=1;
  96.                 }
  97.                 s2c[0].insert(std::make_pair(encode(ds),1));
  98.         }
  99. }

  100. #ifdef DEBUG
  101. #define DUMP(a,b,c) dump(a,b,c)
  102. #else
  103. #define DUMP(a,b,c)
  104. #endif

  105. void dump(int id, const DS& dsf, const DS& dst)
  106. {
  107.         printf("(%d,%d)\n",id/N,id%N);
  108.         printf("FROM ");outds(dsf);
  109.         printf("TO   ");outds(dst);
  110.         printf("\n");
  111. }

  112. int main()
  113. {
  114.         int i;
  115.         DS ds1,ds2;
  116.         time_t t=time(NULL);
  117.         init0();
  118.         std::map<long,long>::iterator mit;
  119.         for(i=1;i<=N*N-1;i++){
  120.                 s2c[i%2].clear();
  121.                 for(mit=s2c[(i-1)%2].begin();mit!=s2c[(i-1)%2].end();++mit){
  122.                         decode(mit->first,ds1);
  123. //                        printf("from ");outds(ds1);
  124.                         int nexttype=-1;
  125.                         if(i>=N){
  126.                                 int os=ds1.bs[i%N];
  127.                                 int st =getstattype(os);
  128.                                 int sp = getstatoff(os);
  129.                                 if(st>=B1)nexttype=CS(EMPT,0);
  130.                                 if(st>=B2H&&(st&1)){//lie
  131.                                         if(sp<(st/2)){
  132.                                                 nexttype=CS(st,sp+1);
  133.                                         }
  134.                                 }
  135.                         }
  136.                         if(i%N>0){
  137.                                 int os=ds1.bs[i%N-1];
  138.                                 int st = getstattype(os);
  139.                                 int sp = getstatoff(os);
  140.                                 if(getstattype(ds1.bs[N])!=EMPT){
  141.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  142.                                         nexttype=CS(EMPT,0);
  143.                                 }
  144.                                 if(i%N<N-1&&getstattype(ds1.bs[i%N+1])!=EMPT){
  145.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  146.                                         nexttype=CS(EMPT,0);
  147.                                 }
  148.                                 if(st>=B1){
  149.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  150.                                         if(st>=B2H&&!(st&1)){//hang
  151.                                                 if(sp<(st/2)){
  152.                                                         if(nexttype>=0)continue;
  153.                                                         nexttype=CS(st,sp+1);
  154.                                                 }
  155.                                         }
  156.                                         if(nexttype<0)nexttype=CS(EMPT,0);
  157.                                 }
  158.                         }
  159.                         if(nexttype>=0){
  160.                                 ds2=ds1;
  161.                                 ds2.bs[i%N]=nexttype;
  162.                                 if(i%N==N-1){
  163.                                         ds2.bs[N]=CS(EMPT,0);
  164.                                 }else{
  165.                                         ds2.bs[N]=ds1.bs[i%N];
  166.                                 }
  167.                                 long v = encode(ds2);
  168.                                 s2c[i%2][v]+=mit->second;
  169.                                 DUMP(i,ds1,ds2);
  170.                         }else{
  171.                                 int j;
  172.                                 for(j=0;j<8;j++){//try put stattype j
  173.                                         int s = CS(j,0); //The block i in stat s
  174.                                         ds2=ds1;
  175.                                         if(j>=B2H){
  176.                                                 if(j&1){
  177.                                                         if(i/N+(j/2)+1>N)continue;
  178.                                                 }else{
  179.                                                         if(i%N+(j/2)+1>N)continue;
  180.                                                 }
  181.                                         }
  182.                                         ds2.bs[i%N]=s;

  183.                                         if(i%N==N-1){
  184.                                                 ds2.bs[N]=CS(EMPT,0);
  185.                                         }else{
  186.                                                 ds2.bs[N]=ds1.bs[i%N];
  187.                                         }
  188.                                         if(j>0){
  189.                                                 int cc=j/2;
  190.                                                 if(ds2.uc[cc]+cc>=4)continue;
  191.                                                 ds2.uc[cc]++;
  192.                                         }
  193.                                         long v=encode(ds2);
  194.                                         s2c[i%2][v]+=mit->second;
  195.                                         DUMP(i,ds1,ds2);
  196.                                 }
  197.                         }
  198.                 }
  199.                 long time_diff = time(NULL)-t;
  200.                 printf("Total %ld stats for level %d (%ld s)\n",s2c[i%2].size(),i,time_diff);
  201.                 fflush(stdout);
  202.         }
  203.         long total=0;
  204.         for(mit=s2c[(N-1)&1].begin();mit!=s2c[(N-1)&1].end();++mit){
  205.                 printf("status %lx count %ld\n",mit->first, mit->second);
  206.                 decode(mit->first,ds1);
  207.                 outds(ds1);
  208.                 for(i=0;i<4;i++){
  209.                         if(ds1.uc[i]+i!=4)break;
  210.                 }
  211.                 if(i<4)continue;
  212.                 for(i=0;i<N;i++){
  213.                         if(getstattype(ds1.bs[i])&1){//lie
  214.                                 if(getstattype(ds1.bs[i])/2!=getstatoff(ds1.bs[i]))break;
  215.                         }
  216.                 }
  217.                 if(i<N)continue;
  218.                 total+=mit->second;
  219.         }
  220.         printf("Total %ld\n",total);
  221. }
复制代码

而7*7的格子放置同样多的海船将只有694381种,可以全部输出用于验证代码的正确性

6x6:  0                           (0s)
7x7:  694381                       (4s)
8x8:  29346468159          (32s)
9x9:  19523498027639       (158s)
10x10:2140733320018399            (663s)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-8-27 11:10:24 | 显示全部楼层
更新一个代码,可以将7x7的所有解输出来,比如:
a.png
代码编译时通过编译选项-DDALL可以将所有解输出
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <map>
  4. #include <vector>
  5. #define N 7
  6. #define EMPT  0
  7. #define B1    1
  8. #define B2H   2
  9. #define B2L   3
  10. #define B3H   4
  11. #define B3L   5
  12. #define B4H   6
  13. #define B4L   7

  14. std::map<long,long> s2c[N*N];
  15. #ifdef DALL
  16. std::map<long, long> prev[N*N];
  17. #endif

  18. static char bsbits[4]={7,3,3,1};
  19. static char bsstart[4]={0,3,5,7};
  20. struct DS{
  21.         char uc[4];
  22.         char bs[N+1];
  23. };

  24. int getuc(long v, int bs)
  25. {

  26.         int r=(v>>55)&255;
  27.         return (r>>bsstart[bs])&bsbits[bs];
  28. }
  29. long setuc(long v,int bs, int s)
  30. {
  31.         int off=55+bsstart[bs];
  32.         v&=~(((1L<<bsbits[bs])-1)<<off);
  33.         v|=((long)s)<<off;
  34.         return v;
  35. }

  36. int getposstat(long v, int k)
  37. {
  38.         return (v>>(k*5))&31;
  39. }

  40. long setposstat(long v, int k, int s)
  41. {
  42.         int off=k*5;
  43.         v&=~(31L<<off);
  44.         v|=(long)s<<off;
  45.         return v;
  46. }

  47. int getstattype(int s)
  48. {
  49.         return (s>>2)&7;
  50. }
  51. int getstatoff(int s)
  52. {
  53.         return s&3;
  54. }

  55. int createstat(int type, int off)
  56. {
  57.         return (type<<2)|off;
  58. }

  59. void decode(long v, DS& ds)
  60. {
  61.         int i;
  62.         for(i=0;i<4;i++)ds.uc[i]=getuc(v,i);
  63.         for(i=0;i<N+1;i++)ds.bs[i]=getposstat(v,i);
  64. }

  65. long encode(const DS& ds)
  66. {
  67.         long v=0L;
  68.         int i;
  69.         for(i=0;i<4;i++)v=setuc(v,i,ds.uc[i]);
  70.         for(i=0;i<N+1;i++)v=setposstat(v,i,ds.bs[i]);
  71.         return v;
  72. }

  73. #define CS(t,o) createstat(t,o)
  74. void outds(const DS& ds, int ne=0)
  75. {
  76.         int i;
  77.         if(ne==0){
  78.         printf("UC{");
  79.         for(i=0;i<4;i++){printf(" %d", ds.uc[i]);}
  80.         printf(" } ");
  81.         }
  82.         for(i=0;i<N+1;i++){
  83.                 if(ne&&i==N)break;
  84.                 if(ds.bs[i]==CS(EMPT,0))printf("E  ");
  85.                 else printf("%c%d%d",getstattype(ds.bs[i])&1?'|':'-',getstattype(ds.bs[i])/2+1,getstatoff(ds.bs[i]));
  86.         }
  87.         printf("\n");
  88. }


  89. void init0()
  90. {
  91.         long x=0;//all empty
  92.         int i,j;
  93.         DS ds;
  94.         for(i=0;i<8;i++){//all 8 stattype
  95.                 ds.uc[0]=ds.uc[1]=ds.uc[2]=ds.uc[3]=0;
  96.                 for(j=0;j<N+1;j++)ds.bs[j]=0;
  97.                 int s = CS(i,0); //The first block in stat s
  98.                 x = 0;
  99.                 ds.bs[0]=s;
  100.                 if(i!=EMPT){
  101.                         int uc=i>>1;
  102.                         ds.uc[i>>1]=1;
  103.                 }
  104.                 s2c[0].insert(std::make_pair(encode(ds),1));
  105.         }
  106. }

  107. #ifdef DEBUG
  108. #define DUMP(a,b,c) dump(a,b,c)
  109. #else
  110. #define DUMP(a,b,c)
  111. #endif

  112. void dump(int id, const DS& dsf, const DS& dst)
  113. {
  114.         printf("(%d,%d)\n",id/N,id%N);
  115.         printf("FROM ");outds(dsf);
  116.         printf("TO   ");outds(dst);
  117.         printf("\n");
  118. }

  119. #ifdef DALL
  120. #define IM1 (i-1)
  121. #define NM1 (N*N-1)
  122. #define I   (i)
  123. std::vector<long> status_stack;
  124. void outputresult()
  125. {
  126.         int i;
  127.         for(i=status_stack.size()-1;i>=0;i--){
  128.                 DS ds1;
  129.                 decode(status_stack[i],ds1);
  130.                 outds(ds1,1);
  131.         }
  132.         printf("\n");
  133. }

  134. void trace(long status, int level)
  135. {
  136.         int i,j;
  137.         if(level%N==N-1){
  138.                 status_stack.push_back(status);
  139.                 if(level==N-1){
  140.                         outputresult();
  141.                         status_stack.pop_back();
  142.                         return;
  143.                 }
  144.         }
  145.         if(level==0)return;
  146.         std::map<long, long>::iterator mit;
  147.         DS ds1, ds2;
  148.         {
  149.                 decode(status, ds1);
  150.                 mit = prev[level].find(status);
  151.                 for(i=0;i<64;i++){
  152.                         if(mit->second&(1L<<i)){
  153.                                 int vN=i/8;
  154.                                 int vi=i%8;
  155.                                 ds2=ds1;
  156.                                 if(vi<=1){
  157.                                         ds2.bs[level%N]=CS(vi,0);
  158.                                 }else if(vi&1){//lie
  159.                                         if(getstattype(ds1.bs[level%N])==vi){
  160.                                                 ds2.bs[level%N]=CS(vi, getstatoff(ds1.bs[level%N])-1);
  161.                                         }else{
  162.                                                 ds2.bs[level%N]=CS(vi, vi/2);
  163.                                         }
  164.                                 }else{//hang
  165.                                         if(level%N==N-1||getstattype(ds1.bs[(level+1)%N])!=vi){
  166.                                                 ds2.bs[level%N]=CS(vi, vi/2);
  167.                                         }else{
  168.                                                 ds2.bs[level%N]=CS(vi, getstatoff(ds1.bs[(level+1)%N])-1);
  169.                                         }
  170.                                 }
  171.                                 if(level%N==0){
  172.                                         ds2.bs[N]=0;
  173.                                 }else if(vN<=1){
  174.                                         ds2.bs[N]=CS(vN,0);
  175.                                 }else if(vN&1){//lie
  176.                                         if(getstattype(ds1.bs[(level-1)%N])==vN){
  177.                                                 ds2.bs[N]=CS(vN, getstatoff(ds1.bs[(level-1)%N])-1);
  178.                                         }else{
  179.                                                 ds2.bs[N]=CS(vN, vN/2);
  180.                                         }
  181.                                 }else{//hang
  182.                                         if(getstattype(ds2.bs[level%N])==vN){
  183.                                                 ds2.bs[N]=CS(vN, getstatoff(ds2.bs[level%N])-1);
  184.                                         }else{
  185.                                                 ds2.bs[N]=CS(vN, vN/2);
  186.                                         }
  187.                                 }
  188.                                 if(getstattype(ds1.bs[level%N])>0 && getstatoff(ds1.bs[level%N])==0){
  189.                                         ds2.uc[getstattype(ds1.bs[level%N])/2]--;
  190.                                 }
  191.                                 long v=encode(ds2);
  192.                                 std::map<long, long>::iterator mit2;
  193.                                 mit2 = s2c[level-1].find(v);
  194.                                 if(mit2 != s2c[level-1].end()){
  195.                                         trace(mit2->first, level-1);
  196.                                 }else{

  197.                                         printf("Invalid reverse finding:\n");
  198.                                         DUMP(level-1,ds2,ds1);
  199.                                 }
  200.                         }
  201.                 }
  202.         }

  203.         if(level%N==N-1){
  204.                 status_stack.pop_back();
  205.         }
  206. }

  207. #else
  208. #define IM1 ((i-1)%2)
  209. #define NM1 ((N-1)%2)
  210. #define I   ((i)%2)
  211. #endif
  212. int main()
  213. {
  214.         int i;
  215.         DS ds1,ds2;
  216.         time_t t=time(NULL);
  217.         init0();
  218.         std::map<long,long>::iterator mit;
  219.         for(i=1;i<=N*N-1;i++){
  220. #ifndef DALL
  221.                 s2c[i%2].clear();
  222. #endif
  223.                 for(mit=s2c[IM1].begin();mit!=s2c[IM1].end();++mit){
  224.                         decode(mit->first,ds1);
  225. //                        printf("from ");outds(ds1);
  226.                         int nexttype=-1;
  227.                         if(i>=N){
  228.                                 int os=ds1.bs[i%N];
  229.                                 int st =getstattype(os);
  230.                                 int sp = getstatoff(os);
  231.                                 if(st>=B1)nexttype=CS(EMPT,0);
  232.                                 if(st>=B2H&&(st&1)){//lie
  233.                                         if(sp<(st/2)){
  234.                                                 nexttype=CS(st,sp+1);
  235.                                         }
  236.                                 }
  237.                         }
  238.                         if(i%N>0){
  239.                                 int os=ds1.bs[i%N-1];
  240.                                 int st = getstattype(os);
  241.                                 int sp = getstatoff(os);
  242.                                 if(getstattype(ds1.bs[N])!=EMPT){
  243.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  244.                                         nexttype=CS(EMPT,0);
  245.                                 }
  246.                                 if(i%N<N-1&&getstattype(ds1.bs[i%N+1])!=EMPT){
  247.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  248.                                         nexttype=CS(EMPT,0);
  249.                                 }
  250.                                 if(st>=B1){
  251.                                         if(nexttype!=-1&&nexttype!=CS(EMPT,0))continue;
  252.                                         if(st>=B2H&&!(st&1)){//hang
  253.                                                 if(sp<(st/2)){
  254.                                                         if(nexttype>=0)continue;
  255.                                                         nexttype=CS(st,sp+1);
  256.                                                 }
  257.                                         }
  258.                                         if(nexttype<0)nexttype=CS(EMPT,0);
  259.                                 }
  260.                         }
  261.                         if(nexttype>=0){
  262.                                 ds2=ds1;
  263.                                 ds2.bs[i%N]=nexttype;
  264.                                 int pvs = 0;
  265.                                 pvs=getstattype(ds1.bs[N])*8+getstattype(ds1.bs[i%N]);
  266.                                 if(i%N==N-1){
  267.                                         ds2.bs[N]=CS(EMPT,0);
  268.                                 }else{
  269.                                         ds2.bs[N]=ds1.bs[i%N];
  270.                                 }
  271.                                 long v = encode(ds2);
  272.                                 s2c[I][v]+=mit->second;
  273. #ifdef DALL
  274.                                 prev[I][v]|=1L<<pvs;
  275. #endif
  276.                                 DUMP(i,ds1,ds2);
  277.                         }else{
  278.                                 int j;
  279.                                 int pvs = getstattype(ds1.bs[N])*8+getstattype(ds1.bs[i%N]);
  280.                                 for(j=0;j<8;j++){//try put stattype j
  281.                                         int s = CS(j,0); //The block i in stat s
  282.                                         ds2=ds1;
  283.                                         if(j>=B2H){
  284.                                                 if(j&1){
  285.                                                         if(i/N+(j/2)+1>N)continue;
  286.                                                 }else{
  287.                                                         if(i%N+(j/2)+1>N)continue;
  288.                                                 }
  289.                                         }
  290.                                         ds2.bs[i%N]=s;

  291.                                         if(i%N==N-1){
  292.                                                 ds2.bs[N]=CS(EMPT,0);
  293.                                         }else{
  294.                                                 ds2.bs[N]=ds1.bs[i%N];
  295.                                         }
  296.                                         if(j>0){
  297.                                                 int cc=j/2;
  298.                                                 if(ds2.uc[cc]+cc>=4)continue;
  299.                                                 ds2.uc[cc]++;
  300.                                         }
  301.                                         long v=encode(ds2);
  302.                                         s2c[I][v]+=mit->second;
  303. #ifdef DALL
  304.                                         prev[I][v]|=1L<<pvs;
  305. #endif
  306.                                         DUMP(i,ds1,ds2);
  307.                                 }
  308.                         }
  309.                 }
  310.                 long time_diff = time(NULL)-t;
  311.                 printf("Total %ld stats for level %d (%ld s)\n",s2c[I].size(),i,time_diff);
  312.                 fflush(stdout);
  313.         }
  314.         long total=0;
  315.         for(mit=s2c[NM1].begin();mit!=s2c[NM1].end();++mit){
  316. #ifndef DALL
  317.                 printf("status %lx count %ld\n",mit->first, mit->second);
  318. #endif
  319.                 decode(mit->first,ds1);
  320. #ifndef DALL
  321.                 outds(ds1);
  322. #endif
  323.                 for(i=0;i<4;i++){
  324.                         if(ds1.uc[i]+i!=4)break;
  325.                 }
  326.                 if(i<4)continue;
  327.                 for(i=0;i<N;i++){
  328.                         if(getstattype(ds1.bs[i])&1){//lie
  329.                                 if(getstattype(ds1.bs[i])/2!=getstatoff(ds1.bs[i]))break;
  330.                         }
  331.                 }
  332.                 if(i<N)continue;
  333. #ifdef DALL
  334.                 trace(mit->first, NM1);
  335. #endif
  336.                 total+=mit->second;
  337.         }
  338.         printf("Total %ld\n",total);
  339. }

复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-23 16:15 , Processed in 0.026876 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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