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;
    }


  • 相关阅读:
    “ODBC驱动程序不支持动态记录集”错误的解决
    Pro *C/C++学习笔记(一)
    探讨全局变量的析构顺序
    指针和数组关系初探
    (转)Visual C++开发工具与调试技巧整理
    对利用Session纪录datagrid模板列中CheckBox的状态的一点改进
    大学老师列传
    重读保尔的意义
    Rich Edit控件的使用
    C++程序员常用工具集
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3129966.html
Copyright © 2011-2022 走看看