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


原文地址:https://www.cnblogs.com/dyllove98/p/3129966.html