1 条题解
-
0
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
- 上传者