1 条题解

  • 0
    @ 2025-9-10 8:54:39

    C++ :

    #define MAXN 80010UL
    #define MAXS 5UL
    
    #include <cstdio>
    #include <queue>
    #include <cstring>
    
    int dx[MAXN],Map_now[MAXS][MAXS],dream[MAXS][MAXS];
    char inp[MAXS<<1];std::queue<int> que;bool ex[MAXN];
    int opx[4]={0,0,1,-1};
    int opy[4]={1,-1,0,0};
    
    inline int Pos(int x,int y){
    	return ((x-1)<<2)+y-1;
    }
    
    inline int Cal(int p[5][5]){
    	int Ans=0;
    	for(int i=1;i<5;i++) for(int j=1;j<5;j++) if(p[i][j]) Ans|=1<<Pos(i,j);
    	return Ans;
    }
    
    int main(){
    	for(int i=1;i<5;i++){scanf("%s",inp+1);for(int j=1;j<5;j++) Map_now[i][j]=inp[j]-'0';}
    	for(int i=1;i<5;i++){scanf("%s",inp+1);for(int j=1;j<5;j++) dream[i][j]=inp[j]-'0';}
    	memset(dx,50,sizeof(dx));int stat;dx[stat=Cal(Map_now)]=0;que.push(stat);
    	while(!que.empty()){
    		int p=que.front(),new_s;que.pop();ex[p]=false;
    		for(int i=1;i<5;i++){
    			for(int j=1;j<5;j++){
    				int new_p=Pos(i,j);
    				if(p&(1<<new_p)){
    					for(int k=0;k<4;k++){
    						int nx=i+opx[k],ny=j+opy[k];
    						int rp=Pos(nx,ny);
    						if(nx<1||nx>4) continue;
    						if(ny<1||ny>4) continue;
    						if((p&(1<<rp))==0){
    							new_s=p;new_s^=1<<new_p;
    							new_s|=1<<rp;
    							if(dx[new_s]>dx[p]+1){
    								dx[new_s]=dx[p]+1;
    								if(!ex[new_s]){
    									ex[new_s]=true;
    									que.push(new_s);
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	printf("%d",dx[Cal(dream)]);
    	return 0;
    }
    
    • 1

    信息

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