zoukankan      html  css  js  c++  java
  • HDU/HDOJ 2102 A计划 广度优先搜索BFS

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2102

    wa了很多次,很悲剧,传送门有几个需要注意的细节,看remap函数,对这些情况的处理。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<cstdio>
    #include<queue>
    #include<fstream>
    using namespace std;
    int n,m,t,flag;
    int dir[4][2]={-1,0,1,0,0,1,0,-1};
    char maze[2][11][11];
    bool visit[2][11][11];
    struct node{
    	int x,y,h;
    	int step;
    }p,q,endp;
    queue<node> Q;
    bool isbond(node &a){
    	if(a.x<0||a.x>=m||a.y<0||a.y>=n)return 1;
    	return 0;
    }
    void bfs()
    {
    	while(!Q.empty())Q.pop();
    
    	p.x=p.y=p.h=p.step=0;
    	visit[0][0][0]=1;
    	Q.push(p);
    	while(!Q.empty())
    	{
    		p=Q.front();
    		Q.pop();
    	
    		if(maze[p.h][p.x][p.y]=='#'){ //传送 
    				if(!visit[!p.h][p.x][p.y]){
    					if(maze[!p.h][p.x][p.y]=='P'){
    						if(p.step<=t){
    							flag=1;
    							return ;
    						}
    						return ;
    					}
    				 visit[!p.h][p.x][p.y]=1;
    				 p.h=!p.h;
    				 Q.push(p);	
    				}
    				
    			   continue;
    			} 	
    		for(int i=0;i<4;i++)
    		{
    			q.x=p.x+dir[i][0];
    			q.y=p.y+dir[i][1];
    			q.h=p.h;
    			q.step=p.step+1;
    			
    			if(isbond(q))continue;  // 边界 
    			if(maze[q.h][q.x][q.y]=='*')continue; //当前障碍 
    			if(visit[q.h][q.x][q.y])continue; //访问 
    			if(maze[q.h][q.x][q.y]=='P'){
    				if(q.step<=t){
    					flag=1;
    					return ;
    				}
    				return ;
    			}
    			visit[q.h][q.x][q.y]=1;
    			Q.push(q);
    		}
    	}
    }
    void remap()
    {
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<m;j++)
    		{
    			if((maze[0][i][j]=='#'&&maze[1][i][j]=='#')||(maze[0][i][j]=='#'&&maze[1][i][j]=='*')||(maze[0][i][j]=='*'&&maze[1][i][j]=='#'))  
    				maze[0][i][j]=maze[1][i][j]='*';  
    		}  
    	}  
    }
    int main()
    {
    	int c;
    //	ifstream fin;
    //	fin.open("aaa.txt");
    	
    	cin>>c;
    	while(c--)
    	{
    		cin>>n>>m>>t;
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++){
    				cin>>maze[0][i][j];
    			}			
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++){
    				cin>>maze[1][i][j];
    			}
    		flag=0;
    		memset(visit,0,sizeof(visit));
    		remap();
    		bfs();
    		if(flag)cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;			
    		
    	}
    	return 0;
    }


  • 相关阅读:
    BZOJ2938 POI2000病毒
    HDU2222 AC自动机模板
    BZOJ1029 [JSOI2007]建筑抢修
    BZOJ1027 [JSOI2007]合金
    BZOJ1025 [SCOI2009]游戏
    BZOJ1257 [CQOI2007]余数之和sum
    BZOJ1021 SHOI2008循环的债务
    BZOJ1030 [JSOI2007]文本生成器(AC自动机)
    POJ2728 Desert King
    POJ2976 Dropping tests
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3129966.html
Copyright © 2011-2022 走看看