USACO2.42Overfencing(bfs)

刚开始想写最短路 没写出来 TLE了在最后一组数据上 加了点优化过了 从两个出口出 像各点BFS 取最小中的最大值

View Code
  1 /*
  2     ID: shangca2
  3     LANG: C++
  4     TASK: maze1
  5 */
  6 #include <iostream>
  7 #include<cstdio>
  8 #include<cstring>
  9 #include<algorithm>
 10 #include<stdlib.h>
 11 #include<queue>
 12 using namespace std;
 13 char str[300][210];
 14 int n,m,f[300][210],dis[4][2] = {0,1,0,-1,1,0,-1,0};
 15 struct node
 16 {
 17     int x,y,num;
 18 };
 19 int bfs(int x,int y,int xx,int yy,int o)
 20 {
 21     int i;
 22     queue<node>q;
 23     memset(f,0,sizeof(f));
 24     node t1;
 25     t1.x = x;
 26     t1.y = y;
 27     t1.num = 0;
 28     f[x][y] = 1;
 29     q.push(t1);
 30     while(!q.empty())
 31     {
 32         node t2 = q.front();
 33         if(t2.num>o)
 34         return o;
 35         q.pop();
 36         if(t2.x==xx&&t2.y == yy)
 37         {
 38             int kk = t2.num;
 39             return kk;
 40         }
 41         for(i = 0 ; i < 4 ; i++)
 42         {
 43             int tx = t2.x+dis[i][0];
 44             int ty = t2.y+dis[i][1];
 45             if(str[tx][ty]==' '&&!f[tx][ty]&&(tx>0&&tx<2*m&&ty>0&&ty<2*n))
 46             {
 47                 f[tx][ty] = 1;
 48                 tx = tx+dis[i][0];
 49                 ty = ty+dis[i][1];
 50                 f[tx][ty] = 1;
 51                 t1.num = t2.num+1;
 52                 t1.x = tx;
 53                 t1.y = ty;
 54                 q.push(t1);
 55             }
 56         }
 57     }
 58 }
 59 int main()
 60 {
 61     freopen("maze1.in","r",stdin);
 62     freopen("maze1.out","w",stdout);
 63     int i,j,k,g=0,e[10];
 64     scanf("%d%d",&n,&m);
 65     for(i = 0; i < 2*m+1 ; i++)
 66     {
 67         getchar();
 68         for(j = 0 ; j < 2*n+1 ; j++)
 69         {
 70             scanf("%c",&str[i][j]);
 71             if(i==0&&str[i][j]==' ')
 72             {
 73                 e[++g] = i+1;
 74                 e[++g] = j;
 75             }
 76             if(i==2*m&&str[i][j]==' ')
 77             {
 78                 e[++g] = i-1;
 79                 e[++g] = j;
 80             }
 81             if(j==0&&str[i][j]==' ')
 82             {
 83                 e[++g] = i;
 84                 e[++g] = j+1;
 85             }
 86             if(j==2*n&&str[i][j]==' ')
 87             {
 88                 e[++g] = i;
 89                 e[++g] = j-1;
 90             }
 91         }
 92     }
 93     int m1=0,m2=0;
 94     for(i = 0 ; i < 2*m+1 ; i++)
 95         for(j = 0 ; j < 2*n+1 ;j++)
 96         {
 97             if(i%2==1&&j%2==1)
 98             {
 99                 int k1 = bfs(e[1],e[2],i,j,100000000);
100                 if(k1<m2)
101                 continue ;
102                 int k2 = bfs(e[3],e[4],i,j,k1);
103                 m1 = min(k2,k1);
104                 m2 = max(m1,m2);
105             }
106         }
107     printf("%d\n",m2+1);
108     return 0;
109 }
原文地址:https://www.cnblogs.com/shangyu/p/3027834.html