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 }
原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/9009245.html