解题记录 BFS 拯救行动

描述
公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。
英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是“骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。
现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要1个单位时间,杀死一个守卫需要花费额外的1个单位时间。同时假设骑士足够强壮,有能力杀死所有的守卫。

给定牢房矩阵,公主、骑士和守卫在矩阵中的位置,请你计算拯救行动成功需要花费最短时间。

输入
第一行为一个整数S,表示输入的数据的组数(多组输入)
随后有S组数据,每组数据按如下格式输入
1、两个整数代表N和M, (N, M <= 200).
2、随后N行,每行有M个字符。”@”代表道路,”a”代表公主,”r”代表骑士,”x”代表守卫, “#”代表墙壁。
输出
如果拯救行动成功,输出一个整数,表示行动的最短时间。
如果不可能成功,输出”Impossible”
样例输入
(输入gg了,想看的直接看原题吧,http://bailian.openjudge.cn/practice/4116/)
样例输出
13
7
思考 :
bfs ,并且如果遇到守卫加的时间是2而不是1 这个需要特判一下,然后要即时更新每个点的数据,保证最小。

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,ans,s_x,s_y,e_x,e_y;
int dir[4][2]={
    
    {
    
    0,1},{
    
    1,0},{
    
    0,-1},{
    
    -1,0}};
struct node
{
    
    
	int x,y,step;
}temp;
queue<node> q;
char map[205][205]={
    
    0};
int time[205][205]={
    
    0};
void bfs()
{
    
    
	time[s_x][s_y]=0;
	temp.x=s_x; temp.y=s_y; temp.step=0;
	q.push(temp);
	while(!q.empty())
	{
    
       node m1;
		temp = q.front();
		q.pop();
		if(map[temp.x][temp.y]=='a')
		{
    
    
			ans=min(ans,temp.step);
		}
		else
		{
    
    
		for(int i=0;i<4;i++)
		{
    
    
			int xx=temp.x+dir[i][0];
			int yy=temp.y+dir[i][1];
			if(xx<0||yy<0||xx>n||yy>m||map[xx][yy]=='#'||temp.step>=time[xx][yy]||temp.step>=ans)
			continue;
			if(map[xx][yy]=='x')
			{
    
    
				time[xx][yy]=temp.step;
				m1.x=xx; m1.y=yy; m1.step=time[xx][yy]+2;
				q.push(m1);
			}
			else
			{
    
    
				time[xx][yy]=temp.step;
				m1.x=xx; m1.y=yy; m1.step=time[xx][yy]+1;
				q.push(m1);
			}
		}
   	  }
	}
}


int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
        ans=0x3f3f3f3f;
	    memset(time,0x3f,sizeof(time)); /*这一步很关键,在判断哪里很关键,
	    不能初始化为0 。
	    */
	   memset(map,0,sizeof(map));
		cin>>n>>m;
		for(int i=0;i<n;i++)
		{
    
    
			for(int j=0;j<m;j++)
			{
    
    
				cin>>map[i][j];
				if(map[i][j]=='r')
				{
    
    
					s_x=i;
					s_y=j;
				}
				if(map[i][j]=='a')
				{
    
    
					e_x=i;
					e_y=j;
				}
			}
		}
			bfs();
			if(ans==0x3f3f3f3f)
			cout << "Impossible" << endl;
			else
	        cout << ans << endl;
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45560445/article/details/104075620