====== 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); }