华容道——又是欠账补债

  以前曾经看过题解,但是不是特别懂,现在自己照着题解打一遍,终于知道是在干什么了……

  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 }
Method_01

  Vijos 300ms

posted @ 2017-08-08 09:00  Darkins  阅读(109)  评论(0)    收藏  举报