Planificador de planes de rescate-1213 bfs + cola de prioridad

Enlace de tema
El tema es el siguiente:

La princesa fue llevada por los malvados y detenida en algún lugar de la celda. Celdas utilizadas N × M (N, M ≤ 200) N \ times M (N, M \ le 200)norte×M ( N ,METRO2 0 0 ) . Cada elemento de la matriz puede representar la carretera (@), la pared (#) y la guardia (x).
El heroico caballero (r) decide salvar a la princesa (a) solo. Suponemos que la expresión del rescate exitoso es "el caballero ha alcanzado la posición de la princesa". Dado que se pueden encontrar guardias en el camino que conduce a la ubicación de la princesa, una vez que el caballero se encuentra con un guardia, el guardia debe ser asesinado para seguir adelante.
Ahora suponga que el caballo puede moverse hacia arriba, abajo, izquierda y derecha. Se necesitan1 1 para quecada posición se mueva.1 unidad de tiempo, se necesita1 1extraparamatar a un guardia1 unidad de tiempo. También se supone que el caballero es lo suficientemente fuerte como para matar a todos los guardias.
Dada la matriz de la celda, la posición de la princesa, el caballero y la guardia en la matriz, calcule el tiempo más corto para que la operación de rescate tenga éxito.

Formato de entrada:

1. Dos números enteros representan NNNM, (N, M ≤ 200) M, (N, M \ le 200)M ,( N ,METRO2 0 0 ) .
2. LuegoNNN líneas, cada línea tieneMMM caracteres. "@" significa camino, "a" representa princesa, "r" representa caballero, "x" representa guardia y "#" representa pared.

Formato de salida:

Si la operación de rescate tiene éxito, se emite un número entero para indicar el tiempo más corto para la operación.
Si es imposible tener éxito, muestre "Imposible".

Entrada de muestra:
7 8
#@#####@
#@a#@@r@
#@@#x@@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
Salida de muestra

13

Entrada de muestra 2
13 40
@x@@##x@#x@x#xxxx##@#x@x@@#x#@#x#@@x@#@x
xx###x@x#@@##xx@@@#@x@@#x@xxx@@#x@#x@@x@
#@x#@x#x#@@##@@x#@xx#xxx@@x##@@@#@x@@x@x
@##x@@@x#xx#@@#xxxx#@@x@x@#@x@@@x@#@#x@#
@#xxxxx##@@x##x@xxx@@#x@x####@@@x#x##@#@
#xxx#@#x##xxxx@@#xx@@@x@xxx#@#xxx@x#####
#x@xxxx#@x@@@@##@x#xx#xxx@#xx#@#####x#@x
xx##@#@x##x##x#@x#@a#xx@##@#@##xx@#@@x@x
x#x#@x@#x#@##@xrx@x#xxxx@##x##xx#@#x@xx@
#x@@#@###x##x@x#@@#@@x@x@@xx@@@@##@@x@@x
x#xx@x###@xxx#@#x#@@###@#@##@x#@x@#@@#@@
#@#x@x#x#x###@x@@xxx####x@x##@x####xx#@x
#x#@x#x######@@#x@#xxxx#xx@@@#xx#x#####@

Salida de muestra 2
7

Esta pregunta debe escribirse usando una cola rápida o una cola de prioridad. El código que cargué primero tiene la forma de coordenadas, y cada vez desde un punto hasta el final de la extensión, debe ordenarse según el tiempo.

El código de clasificación rápido es el siguiente:

#include<iostream>
#include<algorithm>
using namespace std;
struct muban
{
    
    
 	int x;
 	int y;
 	int time;
}que[50000];
char imap[205][205];
int book[205][205];
int next[4][2]={
    
    {
    
    0,1},{
    
    1,0},{
    
    0,-1},{
    
    -1,0}};
bool cmp(muban a,muban b)
{
    
    
 	return a.time<b.time;
}
int main()
{
    
    
 	int n,m;
 	cin>>n>>m;
 	int stax,stay,endx,endy;
 	for(int i=0;i<n;i++)
 	{
    
    
  		for(int j=0;j<m;j++)
  		{
    
    
   			cin>>imap[i][j];
   			if(imap[i][j]=='r')
   			{
    
    
   				stax=i;stay=j;
   			}
   			else if(imap[i][j]=='a')
   			{
    
    
    				endx=i;endy=j;
    				imap[i][j]='@';
   			}
  		}
 	}
 	int head,tail,tx,ty;
 	head=1;
 	tail=2;
 	que[head].x=stax;
 	que[head].y=stay;
 	que[head].time=0;
 	int flag=0;
 	while(head<tail)
 	{
    
    
  		for(int i=0;i<4;i++)
  		{
    
    
   			tx=next[i][0]+que[head].x;
   			ty=next[i][1]+que[head].y;
   			if(tx>=0&&tx<n&&ty>=0&&ty<m)
   			{
    
    
    				if(imap[tx][ty]=='@'&&book[tx][ty]==0)
    				{
    
    
     					book[tx][ty]=1;
     					que[tail].x=tx;
     					que[tail].y=ty;
     					que[tail].time=que[head].time+1;
     					tail++;
    				}
    				else if(imap[tx][ty]=='x'&&book[tx][ty]==0)
    				{
    
    
     					book[tx][ty]=1;
     					que[tail].x=tx;
     					que[tail].y=ty;
     					que[tail].time=que[head].time+2;
     					tail++;
    				}
   			}
   			if(que[tail-1].x==endx&&que[tail-1].y==endy)
   			{
    
    
    				flag=1;
    				break;
   			}
  		}
  		if(flag==1)
  		break;
  		head++;
  		sort(que+head,que+tail,cmp);
 	}
 	if(flag==0)
 	cout<<"Impossible"<<endl;
 	else
 	cout<<que[tail-1].time<<endl;
 	return 0;
}

El código de la cola de prioridad es el siguiente:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct muban
{
    
    
	int x;
	int y;
	int time;
	muban (int xx,int yy,int ttime)
	{
    
    
		x=xx;
		y=yy;
		time=ttime;
	} 
	friend bool operator <(muban a,muban b)
	{
    
    
		return a.time>b.time;
	}
};
char imap[205][205];
int book[205][205];
int next[4][2]={
    
    {
    
    0,1},{
    
    1,0},{
    
    0,-1},{
    
    -1,0}};
int main()
{
    
    
	int n,m;
	int stax,stay,endx,endy;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
    
    
		for(int j=0;j<m;j++)
		{
    
    
			cin>>imap[i][j];
			if(imap[i][j]=='r')
			{
    
    
				stax=i;
				stay=j;
			}
			if(imap[i][j]=='a')
			{
    
    
				endx=i;
				endy=j;
			}
		}
	}
	priority_queue<muban> q;
	muban temp(stax,stay,0);
	book[stax][stay]=1;
	q.push(temp);
	int tx,ty,flag;
	flag=0;
	int sumtime;
	while(q.empty()==0)
	{
    
    
		temp=q.top();
		q.pop();
		for(int i=0;i<4;i++)
		{
    
    
			tx=temp.x+next[i][0];
			ty=temp.y+next[i][1];
			if(tx>=0&&tx<n&&ty>=0&&ty<m)
			{
    
    
				if(book[tx][ty]==0&&imap[tx][ty]=='@')
				{
    
    
					q.push(muban(tx,ty,temp.time+1));
					book[tx][ty]=1;
				}
				if(book[tx][ty]==0&&imap[tx][ty]=='x')
				{
    
    
					q.push(muban(tx,ty,temp.time+2));
					book[tx][ty]=1;
				}
				if(book[tx][ty]==0&&imap[tx][ty]=='a')
				{
    
    
					flag=1;
					sumtime=temp.time+1;
					break;
				}
			}
		}
		if(flag==1)
		break;
	}
	if(flag==0)
	cout<<"Impossible"<<endl;
	else
	cout<<sumtime<<endl;
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Huo6666/article/details/107215226
Recomendado
Clasificación