#include #define MAXW 100 // max. šířka #define MAXH 100 // max. výška #define INFTY 1000000 // toto je nekonečno int x0, y0; // počáteční pozice int h0; // bezpečná výška int T; // počet trampolín int W; // šířka // Jak dlouho padáme, než narazíme na trampolínu // 0=žádná pod námi není, 1=jsme přímo na ní int tramp[MAXW][MAXH]; // kroky[x][y] = min. počet odrazů při skoku // z políčka x,y nebo INFTY, když nelze přežít int kroky[MAXW][MAXH]; int main(void) { // Přečteme vstup a vyznačíme si trampolíny scanf("%d%d%d%d", &x0, &y0, &h0, &T); for (int i=0; i W) W = tx; } // Předpočítáme si vzdálenosti k trampolínám for (int y=1; y<=y0; y++) for (int x=0; x<=W; x++) if (!tramp[x][y] && tramp[x][y-1]) tramp[x][y] = tramp[x][y-1] + 1; // Dynamika zespoda nahoru for (int y=0; y<=y0; y++) for (int x=0; x<=W; x++) { kroky[x][y] = INFTY; if (!tramp[x][y]) { // Není pod námi žádná trampolína if (y <= h0) kroky[x][y] = 0; } else if (tramp[x][y] > 1) { // Spadneme na trampolínu (x,yt) // Odrazíme se do bodu (x,yo) int yt = y - tramp[x][y] + 1; int yo = (y + yt) / 2; if (x > 0 && kroky[x-1][yo]+1 < kroky[x][y]) kroky[x][y] = kroky[x-1][yo] + 1; if (x < W && kroky[x+1][yo]+1 < kroky[x][y]) kroky[x][y] = kroky[x+1][yo] + 1; } } // Vypíšeme výstup if (kroky[x0][y0] < INFTY) { printf("Odrazů: %d\n", kroky[x0][y0]); printf("Ještě přežijeme z výšek:"); for (int y=y0; --y >= 0;) if (kroky[x0][y] < INFTY) printf(" %d", y); putchar('\n'); } else printf("R.I.P.\n"); return 0; }