[bfs][spfa] Jzoj P6286 走格子

Description

 

题解

  • 原题怪出现了 (戳我

 

代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 const int mo=500000,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
 7 struct edge { int x,y; }st,en;
 8 int d[mo+1][2],dis[501][501],bz[501][501],a[501][501],f[501][501][4],n,m;
 9 char map[501][501];
10 void bfs()
11 {
12     int tail=0,head=1;
13     memset(a,127,sizeof(a));
14     for (int i=1;i<=n;i++)
15         for (int j=1;j<=m;j++)
16             if (map[i][j]=='#')
17                 d[++tail][0]=i,d[tail][1]=j,a[i][j]=0;    
18     while (head<tail)
19     {
20         head++;
21         int u=d[head][0],v=d[head][1];
22         for (int i=0;i<4;i++)
23         {
24             int x=u+dx[i],y=v+dy[i];
25             if (x>n||y>m||x<1||y<1||a[u][v]+1>=a[x][y]) continue;
26             d[++tail][0]=x,d[tail][1]=y;
27             a[x][y]=a[u][v]+1;
28         }
29     }
30 }
31 void spfa()
32 {
33     int head=0,tail=1;
34     while (head<tail)
35     {
36         head=head%mo+1;
37         int u=d[head][0],v=d[head][1];
38         bz[u][v]=0;
39         for (int i=0;i<4;i++)
40         {
41             int x=u+dx[i],y=v+dy[i];
42             if ((map[x][y]=='#')||(dis[u][v]+1>=dis[x][y])) continue;
43             dis[x][y]=dis[u][v]+1;
44             if (bz[x][y]) continue;
45             bz[x][y]=1;
46             tail=tail%mo+1;
47             d[tail][0]=x,d[tail][1]=y;
48         }    
49         for (int i=0;i<4;i++)
50         {
51             int x=u,y=v;
52             if (i>1) x=f[u][v][i]; else y=f[u][v][i];
53             if (dis[u][v]+a[u][v]>=dis[x][y]) continue;
54             dis[x][y]=dis[u][v]+a[u][v];
55             if (bz[x][y]) continue;
56             bz[x][y]=1;
57             tail=tail%mo+1;
58             d[tail][0]=x,d[tail][1]=y; 
59         }
60     }
61 }
62 int main()
63 {
64     freopen("cell.in","r",stdin);
65     freopen("cell.out","w",stdout);
66     scanf("%d%d",&n,&m);
67     memset(dis,127,sizeof(dis));
68     for (int i=1;i<=n;i++)
69     {
70         scanf("%s",map[i]+1);
71         for (int j=1;j<=m;j++)
72             if (map[i][j]=='C') st.x=i,st.y=j,dis[i][j]=0;
73             else if (map[i][j]=='F') en.x=i,en.y=j;
74     }
75     for (int i=1;i<=n;i++)
76     {
77         f[i][1][0]=1;
78         for (int j=2;j<=m;j++) if (map[i][j-1]=='#') f[i][j][0]=j; else f[i][j][0]=f[i][j-1][0];
79         f[i][m][1]=m;
80         for (int j=m-1;j;j--) if (map[i][j+1]=='#') f[i][j][1]=j; else f[i][j][1]=f[i][j+1][1];
81     }
82     
83     for (int j=1;j<=m;j++)
84     {
85         f[1][j][2]=1;
86         for (int i=2;i<=n;i++) if (map[i-1][j]=='#') f[i][j][2]=i; else f[i][j][2]=f[i-1][j][2];
87         f[n][j][3]=n;
88         for (int i=n-1;i;i--) if (map[i+1][j]=='#') f[i][j][3]=i; else f[i][j][3]=f[i+1][j][3];
89     }
90     bfs();
91     memset(bz,0,sizeof(bz));
92     d[1][0]=st.x,d[1][1]=st.y;
93     spfa();
94     if (dis[en.x][en.y]>1e9) printf("no\n");
95     else printf("%d\n",dis[en.x][en.y]);
96 }

 

posted @ 2019-08-09 21:32  BEYang_Z  阅读(552)  评论(0编辑  收藏  举报