华容道——又是欠账补债
以前曾经看过题解,但是不是特别懂,现在自己照着题解打一遍,终于知道是在干什么了……
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<vector> 7 #include<cstdio> 8 #include<stack> 9 #include<queue> 10 #include<cmath> 11 #include<map> 12 #include<set> 13 using namespace std; 14 const int N=32,M=0x3f3f3f3f,ax[]={0,-1,1,0,0},ay[]={0,0,0,-1,1},rev[]={0,2,1,4,3}; 15 struct node{int x,y,dr;}; 16 //Definition;// 17 int n,m,qn; 18 bool bd[N][N]; 19 //INput;// 20 int cost[N][N][8][8]; 21 //Usage;// 22 int bfs(node s,node t){ 23 int dis[N][N]; 24 bool vis[N][N]; 25 memset(vis,0,sizeof vis); 26 memset(dis,0x3f,sizeof dis); 27 28 queue<node> q; 29 q.push(s); 30 31 vis[s.x][s.y]=true; 32 dis[s.x][s.y]=0; 33 34 while(!q.empty()&&!vis[t.x][t.y]){ 35 int x=q.front().x,y=q.front().y;q.pop(); 36 for(int i=1;i<=4;i++){ 37 int nx=x+ax[i],ny=y+ay[i]; 38 if(vis[nx][ny]||!bd[nx][ny])continue; 39 q.push((node){nx,ny}); 40 vis[nx][ny]=true; 41 dis[nx][ny]=dis[x][y]+1; 42 } 43 } 44 return dis[t.x][t.y]; 45 } 46 int spfa(int ex,int ey,int sx,int sy,int tx,int ty){ 47 if(sx==tx&&sy==ty)return 0; 48 if(!(bd[sx][sy]&&bd[tx][ty]))return -1; 49 int res=M,dis[N][N][8]; 50 bool vis[N][N][8]; 51 queue<node> q; 52 53 memset(dis,0x3f,sizeof dis); 54 memset(vis,0,sizeof vis); 55 56 bd[sx][sy]=false; 57 for(int i=1;i<=4;i++){ 58 vis[sx][sy][i]=true; 59 q.push((node){sx,sy,i}); 60 dis[sx][sy][i]=bfs((node){ex,ey},(node){sx+ax[i],sy+ay[i]}); 61 } 62 bd[sx][sy]=true; 63 64 while(!q.empty()){ 65 int x=q.front().x,y=q.front().y,dr=q.front().dr;q.pop(); 66 vis[x][y][dr]=false; 67 for(int i=1;i<=4;i++){ 68 int nx=x+ax[i],ny=y+ay[i],ndr=rev[i]; 69 if(dis[nx][ny][ndr]>dis[x][y][dr]+cost[x][y][dr][i]){ 70 dis[nx][ny][ndr]=dis[x][y][dr]+cost[x][y][dr][i]; 71 if(!vis[nx][ny][ndr])vis[nx][ny][ndr]=true,q.push((node){nx,ny,ndr}); 72 } 73 } 74 } 75 for(int i=1;i<=4;i++)res=min(res,dis[tx][ty][i]); 76 return res!=M?res:-1; 77 } 78 //Function;// 79 int main(){ 80 memset(cost,0x3f,sizeof cost); 81 cin>>n>>m>>qn; 82 for(int i=1;i<=n;i++) 83 for(int j=1;j<=m;j++) 84 cin>>bd[i][j]; 85 86 for(int i=1;i<=n;i++) 87 for(int j=1;j<=m;j++) 88 if(bd[i][j]){ 89 bd[i][j]=false; 90 for(int k=1;k<=4;k++) 91 for(int h=1;h<=4;h++){ 92 if(h<k)cost[i][j][k][h]=cost[i][j][h][k]; 93 else if(bd[i+ax[k]][j+ay[k]]&&bd[i+ax[h]][j+ay[h]]) 94 cost[i][j][k][h]=bfs((node){i+ax[k],j+ay[k]},(node){i+ax[h],j+ay[h]})+1; 95 } 96 bd[i][j]=true; 97 } 98 99 while(qn--){ 100 int ex,ey,sx,sy,tx,ty;cin>>ex>>ey>>sx>>sy>>tx>>ty; 101 cout<<spfa(ex,ey,sx,sy,tx,ty)<<endl; 102 } 103 return 0; 104 }
Vijos 300ms

浙公网安备 33010602011771号