1 条题解

  • 1
    @ 2023-6-21 20:14:12

    C++ :

    #include<cstdio>
    #include<cstring>
    using  namespace  std;
    struct  node
    {
        int  x,y,t,gtk;
    }list[16100000],ff[60][60][4];int  head,tail;
    int  d[60][60],n,m,len;
    char  st[60][60],ed[11000];
    int  dx[]={-1,0,1,0};
    int  dy[]={0,1,0,-1};
    inline  bool  check(int  x,int  y){return  (x!=-1  &&  y!=-1);}
    int  main()
    {
        scanf("%d%d",&n,&m);
        for(int  i=1;i<=n;i++)scanf("%s",st[i]+1);
        for(int  i=1;i<=n;i++)
        {
        	for(int  j=1;j<=m;j++)
        	{
        		node  tt;tt.x=tt.y=-1;
        		ff[i][j][0]=ff[i][j][1]=ff[i][j][2]=ff[i][j][3]=tt;
        		for(int  k=j-1;k>=1;k--)
        		{
        			if(st[i][k]!=st[i][j])
    				{
    					ff[i][j][0].x=i,ff[i][j][0].y=k;break;
    				}
    			}
    			for(int  k=j+1;k<=m;k++)
        		{
        			if(st[i][k]!=st[i][j])
    				{
    					ff[i][j][1].x=i,ff[i][j][1].y=k;break;
    				}
    			}
    			for(int  k=i-1;k>=1;k--)
    			{
    				if(st[k][j]!=st[i][j])
    				{
    					ff[i][j][2].x=k,ff[i][j][2].y=j;break;
    				}
    			}
    			for(int  k=i+1;k<=n;k++)
    			{
    				if(st[k][j]!=st[i][j])
    				{
    					ff[i][j][3].x=k,ff[i][j][3].y=j;break;
    				}
    			}
    		}
    	}
        scanf("%s",ed+1);len=strlen(ed+1);ed[++len]='*';
        memset(d,-1,sizeof(d));
        list[1].t=list[1].gtk=0;list[1].x=list[1].y=1;head=1;tail=2;d[1][1]=0;
        while(head!=tail)
        {
            node  x=list[head];x.t++;
    		head++;if(head>16000000)head=1;
    		if(head%10000==0)
    		{
    			head++;head--;
    		}
            if(x.gtk<d[x.x][x.y])continue;
            if(st[x.x][x.y]==ed[x.gtk+1])
            {
                d[x.x][x.y]=++x.gtk;
                list[tail++]=x;
                if(d[x.x][x.y]==len)
                {
                    printf("%d\n",x.t);
                    return  0;
                }
            }
            else
            {
            	for(int  i=0;i<=3;i++)
    	        {
    	            node  y=x;y.x=ff[x.x][x.y][i].x;y.y=ff[x.x][x.y][i].y;
    	            if(check(y.x,y.y)  &&  d[x.x][x.y]>d[y.x][y.y])
    	            {
    	                d[y.x][y.y]=d[x.x][x.y];
    	                list[tail++]=y;if(tail>16000000)tail=1;
    	            }
    	        }
    		}
        }
        return  0;
    }
    

    #10030. 「一本通 1.4 练习 2」Keyboarding

    信息

    ID
    1064
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者