2 条题解
-
0
Zhangxinrong code:
#include<cstdio> #include<cstring> using namespace std; int n,m; char s[11000000]; const int dx[]={-1,1,0,0},dy[]={0,0,-1,1},inf=0x3f3f3f3f; const char dt[]="nswe"; int g[22][22],d[21][21][21][21]; struct point{ int x,y; inline bool operator==(point &b){return x==b.x&&y==b.y;} }ed; struct state{point s,b;int dep,pre;char opt;}st,tmp,q[1100000]; int h,t,ans,last; void bfs(){ ans=inf; h=t=0;q[t++]=st; while(h!=t){ if(q[h].b==ed&&ans>q[h].dep)ans=q[h].dep,last=h; for(int i=0;i<4;++i){ tmp=q[h]; int x=tmp.s.x,y=tmp.s.y; int xx=x+dx[i],yy=y+dy[i]; int tx=tmp.b.x,ty=tmp.b.y; if(g[xx][yy]!=-1){ if(xx==tx&&yy==ty){//人把箱子撞出一格 tx+=dx[i],ty+=dy[i]; if(g[tx][ty]==-1)continue; ++tmp.dep; } if(d[xx][yy][tx][ty]>tmp.dep){ d[xx][yy][tx][ty]=tmp.dep; tmp={xx,yy,tx,ty,tmp.dep,h,dt[i]}; if(tmp.dep!=q[h].dep)tmp.opt-='a'-'A'; q[t++]=tmp; } } } ++h; } } int main(){ int T=0; while(scanf("%d%d",&n,&m)!=EOF&&n&&m){ memset(d,0x3f,sizeof(d)); memset(g,-1,sizeof(g)); for(int i=1;i<=n;++i){ scanf("%s",s+1); for(int j=1;j<=m;++j) if(s[j]!='#'){ g[i][j]=0; if(s[j]=='B')st.b={i,j}; else if(s[j]=='S')st.s={i,j}; else if(s[j]=='T')ed={i,j}; } } printf("Maze #%d\n",++T); bfs(); if(ans==inf){puts("Impossible.\n");continue;} int slen=0; for(int k=last;k;k=q[k].pre)s[++slen]=q[k].opt; for(int i=slen;i>=1;--i)putchar(s[i]); puts("\n"); } return 0; } -
0
<br />
<br />
<br />
Zhangxinrong code:
#include<cstdio> #include<cstring> using namespace std; int n,m; char s[11000000]; const int dx[]={-1,1,0,0},dy[]={0,0,-1,1},inf=0x3f3f3f3f; const char dt[]="nswe"; int g[22][22],d[21][21][21][21]; struct point{ int x,y; inline bool operator==(point &b){return x==b.x&&y==b.y;} }ed; struct state{point s,b;int dep,pre;char opt;}st,tmp,q[1100000]; int h,t,ans,last; void bfs(){ ans=inf; h=t=0;q[t++]=st; while(h!=t){ if(q[h].b==ed&&ans>q[h].dep)ans=q[h].dep,last=h; for(int i=0;i<4;++i){ tmp=q[h]; int x=tmp.s.x,y=tmp.s.y; int xx=x+dx[i],yy=y+dy[i]; int tx=tmp.b.x,ty=tmp.b.y; if(g[xx][yy]!=-1){ if(xx==tx&&yy==ty){//人把箱子撞出一格 tx+=dx[i],ty+=dy[i]; if(g[tx][ty]==-1)continue; ++tmp.dep; } if(d[xx][yy][tx][ty]>tmp.dep){ d[xx][yy][tx][ty]=tmp.dep; tmp={xx,yy,tx,ty,tmp.dep,h,dt[i]}; if(tmp.dep!=q[h].dep)tmp.opt-='a'-'A'; q[t++]=tmp; } } } ++h; } } int main(){ int T=0; while(scanf("%d%d",&n,&m)!=EOF&&n&&m){ memset(d,0x3f,sizeof(d)); memset(g,-1,sizeof(g)); for(int i=1;i<=n;++i){ scanf("%s",s+1); for(int j=1;j<=m;++j) if(s[j]!='#'){ g[i][j]=0; if(s[j]=='B')st.b={i,j}; else if(s[j]=='S')st.s={i,j}; else if(s[j]=='T')ed={i,j}; } } printf("Maze #%d\n",++T); bfs(); if(ans==inf){puts("Impossible.\n");continue;} int slen=0; for(int k=last;k;k=q[k].pre)s[++slen]=q[k].opt; for(int i=slen;i>=1;--i)putchar(s[i]); puts("\n"); } return 0; }
- 1
信息
- ID
- 1089
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 119
- 已通过
- 15
- 上传者