+ Pensamiento variante más corta [USACO07OCT] Carrera de obstáculos S (Valle de Los P1649)

[USACO07OCT] Carrera de obstáculos S

título Descripción

Considere un N x N (1 <= N <= 100) campo cuadrado compone de 1

por 1 azulejos. Algunas de estas baldosas son intransitables por las vacas y están marcados con una 'X' en este campo 5 por 5 que es un reto de navegar:
图略:
Bessie encuentra a sí misma en un tal campo en la ubicación A y quiere pasar a la ubicación B con el fin a lamer el bloque de sal allí. Criaturas lentas, torpes como las vacas no les gusta a girar y, por supuesto, sólo puede moverse en paralelo a los bordes del campo cuadrado. Para un campo dado, determinar el número mínimo de noventa vueltas grado en cualquier trayectoria de A a B. La ruta puede comenzar y terminar con Bessie mirando en cualquier dirección. Bessie sabe que puede llegar a la piedra de sal.

N * N (1 <= N <= 100) en la red, 'X' denota el enrejado no puede caminar, '' representa el enrejado puede caminar. Carmen grasa, y por lo tanto mal giro. Ahora ve al punto B desde el punto A, tendrá que girar al menos 90 grados de curvatura un par de veces?

Formato de entrada

La primera línea de un número entero N, las siguientes N líneas de N caracteres, solamente los caracteres aparecen: '', 'X', 'A', 'B', que muestra la rejilla por encima de la matriz se ha mencionado, después de cada carácter tiene un espacio.

[Datos] escala

2 <= N <= 100

Formato de salida

Un entero: el número mínimo de vueltas. Si no llega, la salida de -1.


Esta pregunta se puede calcular BFS todos los caminos, y obtiene el número mínimo de caminos de un giro absoluto;

Pero también se puede buscar directamente la más corta, lo uso dij algoritmo;

Con el promedio diferente camino más corto desde la más corta Esta pregunta no es la misma redacción, un primer nodo a cada uno con tres propiedades:

  1. Las coordenadas del punto de nodo x e y
  2. La dirección del punto f
  3. Ven a este punto desde el punto de partida de un número mínimo de dirección

La diferencia es que la mayoría de los jueces, y la dij más corto en general para determinar si el equipo no está jugando generalmente igual signo, pero esto tiene que luchar, porque incluso si el mismo camino, la dirección del punto puede ser diferente, y luego determinar si existe atravesado este punto, es diferente; el código anotado;

código:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
using namespace std;
const int N=10000100;
const int M=200100;
const LL mod=2e9+7;
char s[110][110];
int sx,sy,ex,ey,dis[110][110],n;
bool vis[110][110];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
struct Node{
	int x,y,w,f;
	bool operator < (const Node& rhs) const{return w>rhs.w;}
};
void dij(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) dis[i][j]=2e9;
	}
	dis[sx][sy]=0;
	priority_queue<Node>qu;
	qu.push((Node){sx,sy,0,-1});
	while(!qu.empty()){
		Node n1=qu.top();
		qu.pop();
//		if(vis[n1.x][n1.y]) continue;//这个判断条件不能有 
		vis[n1.x][n1.y]=true;
		for(int i=0;i<=3;i++){
			int x=n1.x+dx[i];
			int y=n1.y+dy[i];
			if(x<1||x>n||y<1||y>n||s[x][y]=='x'||vis[x][y]) continue;
			if(n1.f==-1){
				dis[x][y]=1;
				qu.push((Node){x,y,1,i});
			}
			else{
				if(abs(n1.f-i)==2||n1.f==i){//不转向 
					if(dis[x][y]>=n1.w) dis[x][y]=n1.w,qu.push((Node){x,y,dis[x][y],i});
					//必须有等号 
				}
				else{//转向 
					if(dis[x][y]>=n1.w+1) dis[x][y]=n1.w+1,qu.push((Node){x,y,dis[x][y],i});
					//必须有等号 	
				}
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>s[i][j];
			if(s[i][j]=='A') sx=i,sy=j;
			if(s[i][j]=='B') ex=i,ey=j;
		}
	}
	dij();
	if(dis[ex][ey]==2e9) cout<<-1<<endl;
	else cout<<dis[ex][ey]-1<<endl;
	return 0;
}

Publicados 264 artículos originales · alabanza won 46 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44291254/article/details/105347940
Recomendado
Clasificación