zoukankan      html  css  js  c++  java
  • 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;
     }
     }
      

  • 相关阅读:
    JAVA 设计模式 组合模式
    JAVA 设计模式 模板方法模式
    SpringBoot 数据篇之使用JDBC
    [Spring]01_环境配置
    [spring]03_装配Bean
    [Spring]04_最小化Spring XML配置
    [Quartz笔记]玩转定时调度
    [Spring]支持注解的Spring调度器
    asp.net core 系列 13 日志
    asp.net core 系列 12 选项 TOptions
  • 原文地址:https://www.cnblogs.com/c201904xyorz/p/9990803.html
Copyright © 2011-2022 走看看