献给阿尔吉侬的花束 bfs !!!

献给阿尔吉侬的花束 bfs

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

int beginx,beginy,endx,endy;

int nextx,nexty;

int r,c;

int t;

int vis[205][205];

char gg[205][205];

int dir[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}};


struct  Node{
    
    
	int x;
	int y;
	int day;
	Node(){
    
       //必须有无参构造
	}
	
	Node (int xx,int yy,int dayy)  //定义结构体
	{
    
    
		x=xx;
		y=yy;
		day=dayy;
		
	}
}beginn;


queue<Node> qq;


bool isVital(int xx,int yy)
{
    
    
	if(  (xx>=0 && xx<r)&& (yy>=0 && yy<c)  && gg[xx][yy]!='#')  //注意先判断 xx,yy的范围
	{
    
    
		return 1;
	}	
	return 0;
}

void bfs()
{
    
    
	memset(vis,0,sizeof(vis));
	
	beginn.x=beginx;
	beginn.y=beginy;
	beginn.day=0;
	
	vis[beginx][beginy]=1;
	while(!qq.empty())
	{
    
    
		qq.pop();
	}
	
	qq.push(beginn);
	
	while(!qq.empty())
	{
    
    
		Node ff=qq.front();
		qq.pop();
		
		for(int i=0;i<4;i++)
		{
    
    
			nextx=ff.x+dir[i][0];
			nexty=ff.y+dir[i][1];
			
			if(isVital(nextx,nexty) && !vis[nextx][nexty]) //合法且未访问过
			{
    
    
				if(nextx==endx && nexty==endy)
				{
    
    
					printf("%d\n",ff.day+1);
					return;
				 } 
				
				vis[nextx][nexty]=1;
				
//				cout<<nextx<<" "<<nexty<<endl;
				qq.push(Node(nextx,nexty,ff.day+1));

			}
		}
	}
	printf("oop!\n");
}

int main()
{
    
    
	
	cin>>t;
	while(t--)
	{
    
    		
		scanf("%d%d",&r,&c);
//		getchar();     //如果scanf  读取字符,注意scanf c会读取换行符
		for(int i=0;i<r;i++)
		{
    
    
			for(int j=0;j<c;j++)
			{
    
    
		
				cin>>gg[i][j];
//				cout<<gg[i][j];
				if(gg[i][j]=='S')
				{
    
    
					beginx=i;
					beginy=j;
				}else if(gg[i][j]=='E')
				{
    
    
					endx=i;
					endy=j;
				}
			}
//			getchar();
		}
			
		bfs();
	}
		
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45448563/article/details/113622645
BFS