zoukankan      html  css  js  c++  java
  • I

      1 //枚举+BFS
      2 #include<iostream>
      3 #include<cstdio>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<queue>
      8 using namespace std;
      9 
     10 #define INF 0xfffffff
     11 
     12 int T,N,M,len;
     13 char grid[15][15];
     14 
     15 struct Point
     16 {
     17     int x,y;
     18     int times;
     19 }point[105];
     20 
     21 Point p1,p2;
     22 int ans;
     23 bool book[15][15];
     24 
     25 bool isValid(int x,int y)
     26 {
     27     if(x<0 || x>=N || y<0 || y>=M || grid[x][y]!='#' || book[x][y])
     28         return false;
     29     return true;
     30 }
     31 int dir[8]={0,1,0,-1, 1,0,-1,0};
     32 queue<Point> que1;
     33 
     34 int BFS()
     35 {
     36     int counter=1,time=0;
     37     Point tp1,tp2;
     38     memset(book,false,sizeof(book));
     39     que1.push(p1);
     40     book[p1.x][p1.y]=true;
     41 
     42     if(p1.x!=p2.x || p1.y!=p2.y)//起点不同
     43     {
     44         que1.push(p2);
     45         ++counter;
     46         book[p2.x][p2.y]=true;
     47     }
     48 
     49     while(!que1.empty())
     50     {
     51         if(!que1.empty())
     52         {
     53             tp1=que1.front();
     54             for(int i=0;i<8;i+=2)
     55             {
     56                 if(isValid(tp1.x+dir[i], tp1.y+dir[i+1]))
     57                 {
     58                     tp2.times=tp1.times+1;
     59                     tp2.x=tp1.x+dir[i];
     60                     tp2.y=tp1.y+dir[i+1];
     61                     que1.push(tp2);
     62 
     63                     time=tp2.times;
     64                     book[tp2.x][tp2.y]=true; ++counter;
     65                 }
     66             }
     67             que1.pop();
     68         }
     69 
     70     }
     71     if(counter < len)
     72         return -1;
     73     return time;
     74 }
     75 
     76 int main()
     77 {
     78     scanf("%d",&T);
     79     int cnt = 0;
     80     while(T--)
     81     {
     82         cnt++;
     83         len=0; ans=INF;
     84         scanf("%d%d",&N,&M);
     85         for(int i=0;i<N;i++)
     86             scanf("%s",grid[i]);
     87 
     88         for(int i=0;i<N;i++)
     89         for(int j=0;j<M;j++)
     90         {
     91             if(grid[i][j]=='#')
     92             {
     93                 point[len].x=i; point[len].y=j; point[len++].times=0;
     94             }
     95         }
     96 
     97         //枚举每次点燃两个草地的位置
     98         for(int i=0;i<len;i++)
     99         {
    100             p1=point[i];
    101             for(int j=0;j<len;j++)
    102             {
    103             {
    104                 p2=point[j];
    105                 int tans=BFS();
    106                 if(tans!=-1)
    107                     ans=min(ans,tans);
    108             }
    109         }
    110         if(ans == INF)
    111             ans = -1;
    112         printf("Case %d: %d
    ",cnt,ans);
    113     }
    114     return 0;
    115 }
  • 相关阅读:
    计算中文混合字符串长度(一)
    PHP截取含中文的混合字符串长度的函数
    获取星座的JS函数
    获取生日对应星座的PHP函数
    简单的 jQuery 浮动层随窗口滚动滑动插件实例
    MD5算法实现
    70. Climbing Stairs QuestionEditorial Solution
    167. Two Sum II
    167. Two Sum II
    303. Range Sum Query
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/9009245.html
Copyright © 2011-2022 走看看