2 条题解

  • 0
    @ 2025-10-8 16:55:21

    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
      @ 2025-10-8 16:55:12


      <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

      0x20搜索(0x25广度优先搜索)例题3:[UVA589] Pushing Boxes

      信息

      ID
      1089
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      119
      已通过
      15
      上传者