- 注册时间
- 2009-5-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 38515
- 在线时间
- 小时
|
楼主 |
发表于 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;
- }
复制代码 |
|