1 条题解
-
1
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; }
信息
- ID
- 1064
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者