这道题说白了,其实就是最短路径问题,果断用宽搜,但是我们这里要注意的是,
这道题是两个起点的宽搜,两个同时搜,而不是分开搜,我本人就是因为这个错误而做了很久的
#include#include #include using namespace std;const int maxn=20;const int inf=0x3f3f3f3f;char a[maxn][maxn];//char b[maxn][maxn];int step[maxn][maxn];int usedtime=111111111;int direction[4][2]={ { 0,1},{ 1,0},{ -1,0},{ 0,-1}};int column,line; int ans=0; int grasses; int cases=0;struct wo{ int x; int y;};queue p;int fire(){ int grass=0,time=0; while(p.size()){ struct wo help;//结构体的入队需要结构体才能入队 help=p.front();p.pop();
for(int i=0;i<4;i++){ int x1=help.x+direction[i][0],y1=help.y+direction[i][1]; if(x1<1||x1>line)continue; if(y1<1||y1>column)continue; if(a[x1][y1]=='.')continue; if(step[x1][y1]<=step[help.x][help.y]+1)continue;//满足条件才入队 step[x1][y1]=step[help.x][help.y]+1; wo help1; help1.x=x1;help1.y=y1; p.push(help1); grass++;//计算燃烧的草的个数 time=max(step[x1][y1],time);//算时间 } } if(grass==grasses-2)return time;//看燃烧完没有else return 111111111;}
int main(){ int t; cin>>t; while(t--){ usedtime=111111111,grasses=0; cin>>line>>column; for(int i=1;i<=line;i++){
for(int j=1;j<=column;j++){ cin>>a[i][j]; if(a[i][j]=='#')grasses++;//计算草的个数 } } for(int i=1;i<=line;i++){ for(int j=1;j<=column;j++){ if(a[i][j]=='.')continue;//只从有草的地方开始燃烧 for(int s=1;s<=line;s++){ for(int l=1;l<=column;l++){ if(a[s][l]=='.')continue; if(l<=column){ while(p.size())p.pop(); if(i!=s||j!=l){ //cout< <<" "< <
} } } }}}cout<<"Case"<<" "<<++cases<<": "; if(usedtime!=111111111) cout<<