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 }
P1649
技术分享图片
 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

 

以上是关于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

bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond

bzoj1633 / P2875 [USACO07FEB]牛的词汇The Cow Lexicon