bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course
Posted kafuuchino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course相关的知识,希望对你有一定的参考价值。
P1649 [USACO07OCT]障碍路线Obstacle Course
bfs
直接上个bfs
注意luogu的题目和bzoj有不同(bzoj保证有解,还有输入格式不同)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define pi pair<int,int> 7 #define mkp make_pair 8 #define N 105 9 const int d1[4]={0,1,0,-1}; 10 const int d2[4]={1,0,-1,0}; 11 char q[3]; bool dan[N][N]; 12 int a[N][N],vis[N][N],n; 13 pi S,T; queue<pi> h; 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;++i){ 17 for(int j=1;j<=n;++j){ 18 scanf("%s",q); 19 if(q[0]==‘A‘) S=mkp(i,j); 20 if(q[0]==‘B‘) T=mkp(i,j); 21 if(q[0]==‘x‘) dan[i][j]=1; 22 } 23 }h.push(S); 24 while(!h.empty()){ 25 pi u=h.front(); h.pop(); 26 for(int i=0;i<4;++i){ 27 int r1=u.first+d1[i],r2=u.second+d2[i]; 28 while(!dan[r1][r2]){ 29 if(r1>n||r1<1||r2>n||r2<1) break; 30 if(vis[r1][r2]){ 31 r1+=d1[i];r2+=d2[i]; 32 continue; 33 } 34 vis[r1][r2]=vis[u.first][u.second]+1; 35 if(mkp(r1,r2)==T){ 36 printf("%d",max(0,vis[r1][r2]-1)); 37 return 0; 38 }h.push(mkp(r1,r2)); 39 r1+=d1[i];r2+=d2[i]; 40 } 41 } 42 }printf("-1"); 43 return 0; 44 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define pi pair<int,int> 7 #define mkp make_pair 8 #define N 105 9 const int d1[4]={0,1,0,-1}; 10 const int d2[4]={1,0,-1,0}; 11 char q[N]; bool dan[N][N]; 12 int a[N][N],vis[N][N],n; 13 pi S,T; queue<pi> h; 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;++i){ 17 scanf("%s",q); 18 for(int j=1;j<=n;++j){ 19 if(q[j-1]==‘A‘) S=mkp(i,j); 20 if(q[j-1]==‘B‘) T=mkp(i,j); 21 if(q[j-1]==‘x‘) dan[i][j]=1; 22 } 23 }h.push(S); 24 while(!h.empty()){ 25 pi u=h.front(); h.pop(); 26 for(int i=0;i<4;++i){ 27 int r1=u.first+d1[i],r2=u.second+d2[i]; 28 while(!dan[r1][r2]){ 29 if(r1>n||r1<1||r2>n||r2<1) break; 30 if(vis[r1][r2]){ 31 r1+=d1[i];r2+=d2[i]; 32 continue; 33 }vis[r1][r2]=vis[u.first][u.second]+1; 34 if(mkp(r1,r2)==T){ 35 printf("%d",max(0,vis[r1][r2]-1)); 36 return 0; 37 }h.push(mkp(r1,r2)); 38 r1+=d1[i];r2+=d2[i]; 39 } 40 } 41 } 42 }
以上是关于bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course的主要内容,如果未能解决你的问题,请参考以下文章
洛谷P1649 [USACO07OCT]障碍路线Obstacle Course BFS 最小转弯
bzoj1625 / P2871 [USACO07DEC]手链Charm Bracelet
bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads
bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles