====== Hledání nejkratší cesty jezdcem ======
===== Mapa vzdáleností =====
#include
using namespace std;
const int N = 8;
int p [N+1] [N+1]; // mapa vzdalenosti, radek a sloupec 0 nepouzivame
void tisk ()
{
for (int i = 1; i <= N; i++)
{
for (int k = 1; k <= N; k++)
{
int v = p[i][k];
if (v >= 0)
cout << v;
else
cout << ".";
cout << " ";
}
cout << endl;
}
}
void jump (int i, int k, int v = 0)
{
if (i >= 1 && i <= N && k >= 1 && k <= N)
{
if (p [i][k] == -1 || p[i][k] > v)
{
p [i][k] = v;
jump (i+2, k+1, v+1);
jump (i+2, k-1, v+1);
jump (i-2, k+1, v+1);
jump (i-2, k-1, v+1);
jump (i+1, k+2, v+1);
jump (i+1, k-2, v+1);
jump (i-1, k+2, v+1);
jump (i-1, k-2, v+1);
}
}
}
int main ()
{
for (int i = 0; i <= N; i++)
for (int k = 0; k <= N; k++)
p[i][k] = -1;
jump (1, 1);
tisk ();
}
===== Cesta zpět =====
#include
using namespace std;
const int N = 8;
int p [N+1] [N+1]; // mapa vzdalenosti, radek a sloupec 0 nepouzivame
int zx [N+1][N+1]; // x-ova souradnice cesty zpet
int zy [N+1][N+1]; // y-ova
void tisk ()
{
for (int i = 1; i <= N; i++)
{
for (int k = 1; k <= N; k++)
{
int v = p[i][k];
if (v >= 0)
cout << v;
else
cout << ".";
cout << " ";
}
cout << endl;
}
}
void zpet (int i, int k)
{
while (i >= 1 && i <= N && k >= 1 && k <= N)
{
cout << i << "," << k << endl;
int i0 = zx [i][k];
int k0 = zy [i][k];
i = i0;
k = k0;
}
}
void jinak (int i, int k)
{
if (i >= 1 && i <= N && k >= 1 && k <= N)
{
cout << i << "," << k << endl;
jinak (zx[i][k], zy[i][k]);
}
}
void cesta (int i, int k)
{
if (i >= 1 && i <= N && k >= 1 && k <= N)
{
cesta (zx[i][k], zy[i][k]);
cout << i << "," << k << endl;
}
}
void jump (int i, int k, int v = 0, int i0 = 0, int k0 = 0)
{
if (i >= 1 && i <= N && k >= 1 && k <= N)
{
if (p [i][k] == -1 || p[i][k] > v)
{
p [i][k] = v;
zx [i][k] = i0;
zy [i][k] = k0;
jump (i+2, k+1, v+1, i, k);
jump (i+2, k-1, v+1, i, k);
jump (i-2, k+1, v+1, i, k);
jump (i-2, k-1, v+1, i, k);
jump (i+1, k+2, v+1, i, k);
jump (i+1, k-2, v+1, i, k);
jump (i-1, k+2, v+1, i, k);
jump (i-1, k-2, v+1, i, k);
}
}
}
int main ()
{
for (int i = 0; i <= N; i++)
for (int k = 0; k <= N; k++)
{
p [i][k] = -1;
zx [i][k] = -1;
zy [i][k] = -1;
}
jump (1, 1);
tisk ();
cout << endl;
zpet (8, 8);
// cout << endl;
// jinak (8, 8);
cout << endl;
cesta (8, 8);
}