zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/shangyu/p/3027834.html
Copyright © 2011-2022 走看看