Fire Game


 

这道题说白了,其实就是最短路径问题,果断用宽搜,但是我们这里要注意的是,

这道题是两个起点的宽搜,两个同时搜,而不是分开搜,我本人就是因为这个错误而做了很久的

#include<iostream>
#include<cstring>
#include<queue>
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<wo>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<<a[i][j]<<" "<<a[s][l]<<endl;
 				memset(step,inf,sizeof(step)); 
 			       wo ll;
 			        ll.x=i;ll.y=j;step[i][j]=0;
 			        p.push(ll);
 			        ll.x=s;ll.y=l;step[s][l]=0;
 			        p.push(ll);
 			        int ff=fire();
 			        usedtime=min(usedtime,ff);
			 
}
			 } 
		 }
	 }
}
}
cout<<"Case"<<" "<<++cases<<": ";
	 if(usedtime!=111111111)
	 cout<<usedtime<<endl; 
	 else cout<<-1<<endl;
 }
 }
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值