[BZOJ1085] [SCOI2005] caballería

Señalo a la superficie de transferencia del título

1085: [SCOI2005] caballería

Tiempo límite:  10 segundos   Límite de memoria:  162 MB
someter:  2175   Resuelto:  1245
[ Enviar ] [ Estado ] [ Discuta ]

Descripción

  12 blanco y 12 caballero caballero negro sobre un tablero de ajedrez 5 × 5, y hay una vacante. Un caballero puede montar en cualquier momento de acuerdo con
estricnina mueve (que puede ir y es una diferencia entre el eje de abscisas, la ordenada o eje de abscisas diferencia 2 fase la diferencia de fase es 2, la ordenada es la diferencia de fase de la red 1) a un vacío
poco sucesivamente. Dada una tabla inicial, cómo llegar a ser móvil a través de los siguientes objetivos tablero de ajedrez: Con el fin de reflejar la caballería, que deben tener un mínimo de pasos
para completar el número de tarea.


Entrada

  La primera línea tiene un entero positivo T (T <= 10), indica un total de N conjuntos de datos. A continuación, la matriz T de 5 × 5, White Knight representa 0, 1 representa un montar a caballo negro
Shi, * representa una vacante. No hay una línea en blanco entre los dos conjuntos de datos.

Salida

  Para cada línea de salida de datos. Si se puede alcanzar el estado objetivo en el paso 15 o menos (incluyendo los pasos 15), el número de pasos es de salida o salidas de -1.

Ejemplo de entrada

2
10110
01 11 *
10111
01001
00000
01011
110 * 1
01110
01010
00100

Ejemplo de salida

7
-1

INSINUACIÓN

Fuente

[ Enviar ] [ Estado ] [ Discuta ]



A primera vista es un DFS. Pero, después de todo, es una provincia tema ah, pero no podía ver una mano en la SSE a cabo. Por lo tanto, en busca de respuestas sobre el uso de la heurística momento de optimización de búsqueda, es la idea básica de búsqueda heurística y como la mayoría de cortocircuito de la misma, si se considera inferior a la mejor respuesta, a continuación, interrumpir la iteración. Ah, así. Buscar idea es DFS bóveda muy simples.

#include <cstdlib>
#include <cstring>
#include <iostream>

int T, k;
int ans[5][5] = 
{
	{1, 1, 1, 1, 1},
	{0, 1, 1, 1, 1},
	{0, 0, 2, 1, 1},
	{0, 0, 0, 0, 1},
	{0, 0, 0, 0, 0}
};

const int xx[8] = {1, 1, -1, -1, 2, 2, -2, -2};
const int yy[8] = {2, -2, 2, -2, 1, -1, 1, -1};
bool flag = false;

bool judge(int a[5][5])
{
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			if (ans[i][j] != a[i][j])
				return false;
	return true;
}

int eva(int a[5][5], const int s)
{
	int v = 0;
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			if (a[i][j] != ans[i][j])
			{
				v++;
				if (v + s > k)
					return false;
			}
	return true;
}

void Search(const int s, int a[5][5], const int x, const int y)
{
	if (s == k)
	{
		if (judge(a))
			flag = 1;
		return;
	}
	if (flag)
		return;
	for (int i = 0; i < 8; i++)
	{
		int nowx = x + xx[i],
			nowy = y + yy[i];
		if (nowx < 0 || nowx > 4 || nowy < 0 || nowy > 4)
			continue;
		std::swap(a[x][y], a[nowx][nowy]);
		if (eva(a, s))
			Search(s + 1, a, nowx, nowy);
		std::swap(a[x][y], a[nowx][nowy]);
	}
}

int main(int argc, char ** argv)
{
	std::ios_base::sync_with_stdio(false);
	int T;
	std::cin >> T;
	while (T--)
	{
		int a[5][5] = { 0 };
		int x, y;
		std::memset(a, 0, sizeof a);
		for (int i = 0; i < 5; i++)
		{
			char ch[10];
			std::cin >> ch;
			for (int j = 0; j < 5; j++)
				if (ch[j] == '*')
				{
					a[i][j] = 2;
					x = i;
					y = j;
				}
				else
					a[i][j] = ch[j] - '0';
		}
		for (k = 1; k <= 15; k++)
		{
			Search(0, a, x, y);
			if (flag)
			{
				std::cout << k << std::endl;
				break;
			}
		}
		if (!flag)
			std::cout << "-1\n";
		else
			flag = false;
	}
#ifdef __EDWARD_TSUI_EDIT
	std::system("pause");
#endif
	return 0;
}
Publicado 40 artículos originales · ganado elogios 0 · Vistas 5164

Supongo que te gusta

Origin blog.csdn.net/edward00324258/article/details/68940634
Recomendado
Clasificación