- 注册时间
 - 2009-5-22
 
- 最后登录
 - 1970-1-1
 
- 威望
 -  星
 
- 金币
 -  枚
 
- 贡献
 -  分
 
- 经验
 -  点
 
- 鲜花
 -  朵
 
- 魅力
 -  点
 
- 上传
 -  次
 
- 下载
 -  次
 
- 积分
 - 38759
 
- 在线时间
 -  小时
 
 
 
 
 
 
 | 
 
 楼主 |
发表于 2022-9-19 10:33:29
|
显示全部楼层
 
 
 
从左上角走到右下角的最大长度,没有人发布过,我赶紧新建了一个数列: 
 
https://oeis.org/A357234 
 
读者看到这个数列之后,要求我展示程序。 
 
我得借此地展示一下: 
 
- #include<cstdio>
 
 - #include<cstring>
 
  
- const int p=62200001,q=9999;
 
 - struct e
 
 - {
 
 -         unsigned __int64 k;
 
 -         int l;
 
 - };
 
 - e a[p+q],b[p+q];
 
 - int n,h,i,j,k,t,br[24],bl,u,v;
 
 - unsigned __int64 x,w;
 
  
- void ad(int d)
 
 - {
 
 -         if(j>n-2)
 
 -         {
 
 -                 if(br[n+1]>1)return;
 
 -                 br[n+1]=0;
 
 -         }
 
 -         if(d>1)
 
 -         {
 
 -                 for(k=1;k<n+2;k++)
 
 -                         if(br[k]>1)return;
 
 -                 k=a[h].l+1;
 
 -                 if(k>bl)
 
 -                 {
 
 -                         bl=k;
 
 -                         k=n*i+j;
 
 -                 }
 
 -                 return;
 
 -         }
 
 -         w=1,x=0;
 
 -         for(k=1;k<n+2;k++,w*=5)
 
 -                 x+=w*br[k];
 
 -         for(k=int(x%p);b[k].l;k++)
 
 -                 if(x==b[k].k)
 
 -                 {
 
 -                         if(a[h].l+d<=b[k].l)return;
 
 -                         break;
 
 -                 }
 
 -         b[k].k=x;
 
 -         u+=!b[k].l;
 
 -         b[k].l=a[h].l+d;
 
 - }
 
  
- int gp(int p)
 
 - {
 
 -         if(br[p]==3)
 
 -                 for(k=0;;p++)
 
 -                 {
 
 -                         if(br[p]==3)k++;
 
 -                         if(br[p]==4)
 
 -                         {
 
 -                                 k--;
 
 -                                 if(!k)return p;
 
 -                         }
 
 -                 }
 
 -         if(br[p]==4)
 
 -                 for(k=0;;p--)
 
 -                 {
 
 -                         if(br[p]==4)k++;
 
 -                         if(br[p]==3)
 
 -                         {
 
 -                                 k--;
 
 -                                 if(!k)return p;
 
 -                         }
 
 -                 }
 
 -         return p;
 
 - }
 
  
- void go(int s)
 
 - {
 
 -         if(s==0)
 
 -         {
 
 -                 ad(0);
 
 -                 if(!i&&!j||i>n-2&&j>n-2)
 
 -                 {
 
 -                         br[j+1]=1;
 
 -                         br[j+2]=2;
 
 -                         ad(1);
 
 -                         br[j+1]=2;
 
 -                         br[j+2]=1;
 
 -                         ad(1);
 
 -                 }
 
 -                 br[j+1]=3;
 
 -                 br[j+2]=4;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==25||s==6||s==31||s==7||s==32||s==8||s==33||s==9||s==34)
 
 -         {
 
 -                 br[j+1]=0;
 
 -                 br[j+2]=0;
 
 -                 ad(0);
 
 -                 return;
 
 -         }
 
 -         if(s==50)
 
 -         {
 
 -                 br[j+1]=1;
 
 -                 ad(1);
 
 -                 br[j+1]=2;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==75||s==100)
 
 -         {
 
 -                 br[j+1]=1;
 
 -                 ad(1);
 
 -                 br[j+1]=s/25;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 if(!i&&!j||i>n-2&&j>n-2)
 
 -                 {
 
 -                         br[gp(j+1)]=2;
 
 -                         br[j+1]=1;
 
 -                         br[j+2]=1;
 
 -                         ad(1);
 
 -                 }
 
 -                 return;
 
 -         }
 
 -         if(s==11)
 
 -         {
 
 -                 if(!i&&!j||i>n-2&&j>n-2)
 
 -                 {
 
 -                         br[j+1]=1;
 
 -                         br[j+2]=1;
 
 -                         ad(2);
 
 -                 }
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=2;
 
 -                 ad(1);
 
 -                 br[j+1]=2;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==61)
 
 -         {
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=1;
 
 -                 ad(2);
 
 -                 return;
 
 -         }
 
 -         if(s==86||s==111)
 
 -         {
 
 -                 br[gp(j+2)]=2;
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==16||s==21)
 
 -         {
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=s/5;
 
 -                 ad(1);
 
 -                 if(!i&&!j||i>n-2&&j>n-2)
 
 -                 {
 
 -                         br[j+1]=s/5;
 
 -                         br[j+2]=1;
 
 -                         br[gp(j+1)]=2;
 
 -                         br[j+1]=1;
 
 -                         ad(1);
 
 -                 }
 
 -                 return;
 
 -         }
 
 -         if(s==66||s==71)
 
 -         {
 
 -                 br[gp(j+1)]=2;
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==91||s==96||s==121)
 
 -         {
 
 -                 if(s==91)br[gp(j+2)]=3;
 
 -                 if(s==121)br[gp(j+1)]=4;
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 -         if(s==23)
 
 -         {
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=4;
 
 -                 ad(1);
 
 -                 if(!i&&!j||i>n-2&&j>n-2)
 
 -                 {
 
 -                         br[j]=2;
 
 -                         br[j+1]=1;
 
 -                         br[j+2]=1;
 
 -                         ad(1);
 
 -                 }
 
 -                 return;
 
 -         }
 
 -         if(s==73||s==98||s==123)
 
 -         {
 
 -                 br[j]=s/25;
 
 -                 br[j+1]=1;
 
 -                 br[j+2]=1;
 
 -                 ad(1);
 
 -                 return;
 
 -         }
 
 - }
 
  
- int main()
 
 - {
 
 -         for(n=2;n<20;n++)
 
 -         {
 
 -                 memset(a,0,sizeof(a));
 
 -                 a[0].l=1;
 
 -                 for(i=0;i<n;i++)
 
 -                 {
 
 -                         for(j=0;j<n;j++)
 
 -                         {
 
 -                                 for(u=h=0;h<p;h++)
 
 -                                         if(a[h].l)
 
 -                                         {
 
 -                                                 x=a[h].k;
 
 -                                                 for(t=0,k=1;k<n+2;x/=5)
 
 -                                                 {
 
 -                                                         br[k]=int(x%5);
 
 -                                                         if(br[k++]==2)t++;
 
 -                                                 }
 
 -                                                 go(br[j]+br[j+1]*5+br[j+2]*25);
 
 -                                         }
 
 -                                 if(u>v)v=u;
 
 -                                 printf("%d %d %c",i,j,13);
 
 -                                 memcpy(a,b,sizeof(a));
 
 -                                 memset(b,0,sizeof(b));
 
 -                         }
 
 -                         for(h=0;h<p;h++)
 
 -                                 a[h].k*=5;
 
 -                 }
 
 -                 printf("n=%d: length=%d, status=%d\n",n,bl-1,v);
 
 -         }
 
 -         return 0;
 
 - }
 
  复制代码 |   
 
 
 
 |