标签:-- void inline title ott using tchar tin fine
dfs+spfa
# include<iostream> # include<cstdio> # include<cstring> # include<queue> # define inv inline void # define ini inline int # define is isdigit(ch) # define ge getchar() using namespace std; struct o{ int x,y,dis; }; int n,m,g,s1,s2,e1,e2,t1,t2,num,tot,minn; int mv1[4]={0,0,1,-1}; int mv2[4]={1,-1,0,0}; int to[5],en1[5],en2[5],pay[5],h[901]; int d[31][31][31][31][4]; bool use[31][31],vis[31][31],see[31][31],tp[31][31]; bool ll[31][31][31][31]; ini read() { int x=0; char ch=ge; while(!is) ch=ge; while(is) { x=x*10+ch-48; ch=ge; } return x; } inv spfa(int x,int y,int k) { queue<o>q; d[x][y][x][y][k]=0; q.push((o){x,y,0}); while(!q.empty()) { o t=q.front(); q.pop(); see[t.x][t.y]=0; for(int i=0;i<4;i++) { int xxx=t.x+mv1[i],yyy=t.y+mv2[i]; if(use[xxx][yyy]&&d[x][y][xxx][yyy][k]>d[x][y][t.x][t.y][k]+ll[t.x][t.y][xxx][yyy]&&ll[t.x][t.y][xxx][yyy]) { d[x][y][xxx][yyy][k]=d[x][y][t.x][t.y][k]+ll[t.x][t.y][xxx][yyy]; if(!see[xxx][yyy]) { see[xxx][yyy]=1; q.push((o){xxx,yyy,0}); } } } } } inv bfs() { queue<o>q; q.push((o){e1,e2,0}); vis[e1][e2]=0; while(!q.empty()) { o t=q.front(); q.pop(); for(int i=0;i<4;i++) { int xx=t.x+mv1[i],yy=t.y+mv2[i]; if(vis[xx][yy]) if(xx==s1&&yy==s2) { tot++; to[tot]=i; en1[tot]=t.x; en2[tot]=t.y; pay[tot]=t.dis; } else { vis[xx][yy]=0; q.push((o){xx,yy,t.dis+1}); } } } } inv dfs(int x,int y,int fa1,int fa2,int go,int tott) { if(tott>=minn) return; if(x==t1&&y==t2) { minn=tott; return; } use[x][y]=0; for(int i=0;i<4;i++) { int xx=x+mv1[i],yy=y+mv2[i]; if(d[fa1][fa2][xx][yy][go]<1e5&&use[xx][yy]&&!tp[xx][yy]) { tp[xx][yy]=1; dfs(xx,yy,x,y,i,tott+d[fa1][fa2][xx][yy][go]+1); tp[xx][yy]=0; } } use[x][y]=1; } int main() { memset(d,1,sizeof(d)); n=read(),m=read(),g=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) use[i][j]=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<4;k++) { int xx=i+mv1[k],yy=j+mv2[k]; if(use[xx][yy]) { ll[xx][yy][i][j]=1; ll[i][j][xx][yy]=1; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<4;k++) { int xx=i+mv1[k],yy=j+mv2[k]; if(use[i][j]&&use[xx][yy]) { use[xx][yy]=0; spfa(i,j,k); use[xx][yy]=1; } } while(g--) { tot=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) vis[i][j]=use[i][j]; e1=read(),e2=read(),s1=read(),s2=read(),t1=read(),t2=read(); if(s1==t1&&s2==t2) { printf("0\n"); continue; } bfs(); if(!tot) { printf("-1\n"); continue; } minn=9999999; for(int i=1;i<=tot;i++) dfs(s1,s2,en1[i],en2[i],to[i],pay[i]); printf("%d\n",(minn==9999999)?-1:minn); } return 0; }
标签:-- void inline title ott using tchar tin fine
原文地址:https://www.cnblogs.com/ainiyuling/p/11567333.html