Señalo a la superficie de transferencia del título
1085: [SCOI2005] caballería
Tiempo límite: 10 segundos Límite de memoria: 162 MBsometer: 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
10110
01 11 *
10111
01001
00000
01011
110 * 1
01110
01010
00100
Ejemplo de salida
-1
INSINUACIÓN
Fuente
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;
}