bzoj1193 [HNOI2006] Construcción de distancia a caballo + enumeración

En primer lugar, definitivamente no se trata de saltar directamente por xy, porque habrá varias posiciones especiales:

(0,0) a (1,1)

(0,0) a (1,0)

(0,0) a (4,4)

El enfoque normal es saltar 2 para distancias largas y 1 para distancias cortas, pero esto no es factible en estos puntos similares.

Primero que nada, debe haber un tramo donde se acerquen ambas coordenadas, y hay muchas más

Si ambos se acercan, debe ser la solución óptima para la posición actual, pero si solo se acerca, es posible que la posición actual no caiga en el punto objetivo.

Se puede encontrar jugando con las manos que, en este caso, la distancia al punto de destino ya está muy cerca. Al considerar cómo ir a continuación, de hecho, también se puede considerar como dónde comenzar y puede simplemente llegar al punto de destino. acercarse. En realidad, estos dos problemas son equivalentes

Por lo tanto, es equivalente a terminar la parte más inteligente de la aproximación con el método de enumeración y simplemente abordar el juicio directamente.


código:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
queue<int>qxx,qyy,ff;
int xx,yy,i,j,xxxx,yyyy,ans=199999999,lxx,lyy,lff;
bool b[404][404];
int check(int xx,int yy)
{
	int lin=0;
if(xx<yy)swap(xx,yy);
if(xx>=yy*2)
{
	lin+=yy;
	xx-=2*yy;
	yy=0;
	if(xx%4==0)return lin+xx/2;
	else return 199999999;	
}else
{
	int o=xx-yy;
	lin+=o;//走到相同 
	yy-=o;xx-=2*o;
	//一起走 
	if(xx%3==0)return xx/3*2+lin;
	else return 199999999; 
}
}
int main()
{
	scanf("%d%d%d%d",&xx,&yy,&xxxx,&yyyy);
	qxx.push(0);
	qyy.push(0);
	ff.push(0);
	while(!ff.empty())
{
	lxx=qxx.front();
	lyy=qyy.front();
	lff=ff.front();
	qxx.pop(),qyy.pop(),ff.pop();
	if(lxx<-100||lxx>100||lyy<-100||lyy>100)continue;
	ans=min(lff+check(abs(lxx+xx-xxxx),abs(lyy+yy-yyyy)),ans);
	if(!b[lxx+2+120][lyy+1+120])
		{
		b[lxx+2+120][lyy+1+120]=1;
			ff.push(lff+1);
			qxx.push(lxx+2);
			qyy.push(lyy+1);
		}
			if(!b[lxx+2+120][lyy-1+120])
		{b[lxx+2+120][lyy-1+120]=1;
			ff.push(lff+1);
			qxx.push(lxx+2);
			qyy.push(lyy-1);
		}
	if(!b[lxx-2+120][lyy+1+120])
		{
		b[lxx-2+120][lyy+1+120]=1;
			ff.push(lff+1);
			qxx.push(lxx-2);
			qyy.push(lyy+1);
		}
			if(!b[lxx-2+120][lyy-1+120])
		{b[lxx-2+120][lyy-1+120]=1;
			ff.push(lff+1);
			qxx.push(lxx-2);
			qyy.push(lyy-1);
		}
		if(!b[lxx+1+120][lyy+2+120])
		{
		b[lxx+1+120][lyy+2+120]=1;
			ff.push(lff+1);
			qxx.push(lxx+1);
			qyy.push(lyy+2);
		}
			if(!b[lxx+1+120][lyy-2+120])
		{b[lxx+1+120][lyy-2+120]=1;
			ff.push(lff+1);
			qxx.push(lxx+1);
			qyy.push(lyy-2);
		}
	if(!b[lxx-1+120][lyy+2+120])
		{
		b[lxx-1+120][lyy+2+120]=1;
			ff.push(lff+1);
			qxx.push(lxx-1);
			qyy.push(lyy+2);
		}
			if(!b[lxx-1+120][lyy-2+120])
		{b[lxx-1+120][lyy-2+120]=1;
			ff.push(lff+1);
			qxx.push(lxx-1);
			qyy.push(lyy-2);
		}	
}
printf("%d",ans);
}

Supongo que te gusta

Origin blog.csdn.net/haobang866/article/details/79334874
Recomendado
Clasificación