Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 03. 02. 2010 11:51 — Editoval bludistak (03. 02. 2010 11:51)

bludistak
Zelenáč
Příspěvky: 2
Reputace:   
 

textove bludiste

cau nevite prosim nekdo jak udelat program s bludistem, kde hvezdicka je zed, mezera volny prostor, S start, E konec a program musi zjistit jestli de bludiste projit od startu ke konci (chodit se da jenom nahoru, dolu, doleva, doprava)  a jeste musi zjistit kolik tahu bylo potreba udelat

jakoze treba takhle by to vypadalo

Zadejte bludiste:
********
*S     *
*     E*
********
Potrebny pocet kroku: 6

predem diky za jakoukoliv radu

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 03. 02. 2010 12:24

Dargorar
Příspěvky: 41
Reputace:   
 

Re: textove bludiste

Ahoj,

Resil bych to pres barevni grafu, tj. udrzoval bych si v kazdem kroku algoritmu mnozinu navstivenych vrcholu (na zacatku jenom S) a ukazdeho vrcholu bych si zjistil jeho doposud nenavstivene sousedy v povolenych smerech. To znamena, ze u kazdeho policka krome pozice bych si uchovaval tyto hodnoty: navstiven (ANO/NE) cas (Integer). Cas by byl na zacatku algoritmu nastaven na 1 a po prozkoumani vsech sousedu aktualne navstivenych vrcholu (oznacme tuto mnozinu jako M) bych cas zvetsil o 1. U policek urcujici zed bych atribut navstivenosti na zacatku nastavil na ANO stejne tak Policku S a vsem ostatnim na NE. No a pak uz jenom celou dobu delas to same (zjistujes nenavstivene sousedy vrcholu v mnozine M oznacis je jako navstivene priradis jim aktualni cas navstiveni a Mnozinu M potom vyprazdnis a nasypes do ni tyto vsechny nove dosazene vrcholy v kazdem kroku). Toto opakujes, dokud do M nevlozis policko E.

Je to jasne?

Offline

 

#3 03. 02. 2010 12:28 — Editoval musixx (03. 02. 2010 12:30)

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: textove bludiste

Jen doplním, že tento naivní přístup se nazývá čtyřsouvislý flood-fill.

EDIT: Zastavit je třeba také tehdy, když (v daném patře stromu) není doplněn ani jeden nový list. Může se totiž stát, že cesta z uzlu S do uzlu E vůbec neexistuje. A má se vůbec najít cesta minimální délky?

Offline

 

#4 03. 02. 2010 15:27 — Editoval Kondr (03. 02. 2010 15:39)

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4247
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: textove bludiste

↑ Dargorar: Úspornější je do pole cas uložit -1 pro zdi a 0 pro všechny nenavštívené vrcholy a pole navstiven zrušit.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#5 03. 02. 2010 15:28

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: textove bludiste

Já bych takovouto "problematiku" řešil dynamicky přes 2 rozměrné pole. (ale to je složité pro začátečníky. Ještě je taky důležité, v jakém prog. jazyku to děláš).
Budeš mít pole i*j velké. Randomem nebo jakýmkoliv způsobem se Ti nagenerují ty překážky start a cíl... Ty přesně budeš vědět, na které pozici A[i][j] se ti nachází start a kde A[i][j] cíl... Známými algoritmy budeš procházet od startu k cíli, dokud (while) nenarazíš na cíl. Potom je průchod správný. Takže v tom whilu budeš mít ještě if (který Ti bude kontrolovat jestliže si nenašel překážku) tak inkrementuj průchody. Potom můžeš mít třeba pomocí struktury všechny cesty...

Cesta. kde[0] = 6;
Cesta. kde[1] = 5;

Vím, zní to složitě, ale jednou jsem se o něco podobného pokoušel a šlapalo to... Jinak řešení, co napsal Dargorar není těžké a je to základní algoritmus pro tvůj problém. Logicky by jsi na něj přišel i ty sám.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#6 03. 02. 2010 15:32

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: textove bludiste

↑ RePRO: Já nevím, ale chce se mi napsat "drž se toho webdesignu a používej si tam dynamicky random, dokud (while) nenarazíš na cíl"... :-)))

Offline

 

#7 03. 02. 2010 15:36

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: textove bludiste

↑ musixx:

Neumím psát a vyjadřovat se. Nikdy jsem nepotřeboval zkoušet známé algoritmy. :-)) Na každou problematiku si přijdu sám, logicky. ;-)

Pokud si myslíš, že by to takto řešit nešlo, tak jsi na špatné adrese. :-))


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#8 03. 02. 2010 15:53

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4247
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: textove bludiste

Není potřeba si dokazovat, kdo by to uměl vyřešit, je účelné pomoct tazateli. To, že se pracuje s dvojrozměrným polem a že přesně víme, kde je start, jsou triviální poznatky, které není potřeba zmiňovat. Že bude v programu nějaký while (if, for, forever) je také zřejmé. Klíčové je to, co psal Dragorar. Jistě ho můžeme doplnit poznámkami na zefektivnění případně nabídnout implementačně složitější algoritmy (http://en.wikipedia.org/wiki/A*_search_algorithm). Pokud ale již nic konstrukttivního nevymyslíme, nešpiňme toto vlákno. Prosím nepište ani omluvy že "toto neměl být flame". V to totiž doufám ;-)

Díky za pochopení.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#9 04. 02. 2010 14:14

bludistak
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: textove bludiste

diky vam vsem za rady ale bohuzel musim priznat ze stejne porad netusim mam tu sepsany naky kody ale stejne moc nevim co s nima ale ukazu vam je aspon jestli du spravnou cestou

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define radek 6

int main(int argc, char** argv) {
    int vyska = 0, sirka = 0, maxsirka = 0, i, j;
    char c, **pole;
    printf("Zadejte bludiste:\n");
    do {
        /*pohyb ve sloupci smerem dolu - pridavani radku*/
        if (vyska != 0) {
            /*jiny nez prvni pruchod*/
            pole = (char **) realloc(pole, (vyska + 1) * sizeof (char *));
            pole[vyska] = (char *) malloc(1 * sizeof (char));

        }
        sirka = 0;
        do {
            /*pohyb v radku - pridavani sloupcu*/
            if (sirka == 0 && vyska == 0) {
                /*prvni bunka v prvnim radku*/
                pole = (char **) malloc(1 * sizeof (char *));
                pole[0] = (char *) malloc(1 * sizeof (char));
            } else {
                /*vsechny ostatni bunky (radky)*/
                if (sirka != 0) {
                    /*jina nez prvni bunka v radku*/
                    pole[vyska] = (char *) realloc(pole, (sirka + 1) * sizeof (char));
                }
            }
            if (scanf("%c", &c) == 1) {
                pole[vyska][sirka] = c;

            } else {
                /*osetreni nespravneho vstupu co do hodnoty znaku*/

            }
            if (sirka > maxsirka) {
                /*nalezeni nejdelsiho radku*/
                maxsirka = sirka;
            }
            sirka++;
        } while (c != '\n');
        vyska++;
    } while (vyska != radek);
    /*podminka ^^^ define radek musi byt o jednu vetsi nez  max index vysky*/

    /*
        for (i = 0; i < vyska; i++) {
            for (j = 0; j <= maxsirka; j++) {
                printf("%c", pole[i][j]);
                if (pole[i][j] == '\n') {
                    break;
                }
            }
        }
     */
        printf("\n");
    return (EXIT_SUCCESS);
}


a tady mam jeste neco od kamose

#include <stdlib.h>
#include <stdio.h>

/* Nacte data ze standardniho vstupu, alokuje pamet a zmeni pointer data tak, aby na ne ukazoval.
* Neoddeluje radky, vsechno nasype do jednoho retezce - znaky '\n' cte jako normalni znak.
* Pokud dojde pamet, vrati -1 a data=NULL
* pouziti:
*   int pocet_znaku;
*   char* data;
*   pocet_znaku=nacti_data(&data);
*   printf("nactena data: %s",data);
*/
int nacti_data(char** data) {
    int cislo_bloku=1;
    size_t nactenych_bytu;
    size_t nactenych_bytu_celk=0;
    *data=(char*)malloc(12*sizeof(char));
    if(*data==NULL) {
        return(-1);
    }
    while(1) {
        *data=(char*)realloc(*data,10*cislo_bloku*sizeof(char)+2);
        if(*data==NULL) {
            return(-1);
        }
        nactenych_bytu=fread((*data+nactenych_bytu_celk),sizeof(char),10,stdin);
        nactenych_bytu_celk+=nactenych_bytu;
        if(nactenych_bytu!=10) {//    dosazeno konce souboru
            *(*data+(cislo_bloku-1)*10+nactenych_bytu)='\0';
            break;
        }
        cislo_bloku++;
    }
    return(nactenych_bytu_celk);
}



/* rozseka data nacteny funkci nacti_data na pole retezcu pole[radek]
*
* vstup: char* p_data, int pocet_znaku
* vystup: pocet_radku, navratova hodnota char** pole.....pole[radek][znak]
*
* pocet_radek...posledni index=pocet_radek-1
*
* za poslednim radkem musi byt '\n' jinak to blbne - vynechava posledni radku, priklady z progtestu by to mely splnovat
*/
char** rozsekej_data_na_radky(char* data,int pocet_znaku,int* pocet_radku) {
    char** pole=NULL;
    int i,zacatek_radku=0;
    int radek=1;

   
    pole=(char**)malloc(sizeof(char*));
    if(pole==NULL) return(NULL);
   
    for(i=0;i<pocet_znaku;i++) {
        if( *(data+i)=='\n' || *(data+i)=='\0'  ) {
           
            pole=(char**)realloc(pole,radek*sizeof(char*)+1);
            if(pole==NULL) return(NULL);
           
           
            pole[radek-1]=data+zacatek_radku;
            zacatek_radku=i+1;
           
            //if( *(data+i+1)=='\0' ) break;
           
           
            if( *(data+i)=='\0') break;
            radek++;
            *(data+i)='\0';
   
        }
    }
    *pocet_radku=radek-1;
    return(pole);
}


int main(void) {
    char* data;
    int pocet_znaku;
    pocet_znaku=nacti_data(&data);
   
    printf("\n");
    printf("Nactena data: \n%s",data);
    printf("\nNacteno %d bytu.\n",pocet_znaku);
   
    printf("\n--------data---rozsekana---na--radky-----------\n");
   
    int pocet_radek;
    char** pole;
    int i;
    pole=rozsekej_data_na_radky(data,pocet_znaku,&pocet_radek);
    printf("\nPocet radek je: %d.",pocet_radek);
    for(i=0;i<pocet_radek;i++) {
        printf("\nRadek \t%d \t:%s",i,pole[i]);
    }
   
    printf("\nToto je 3. pismeno z 1. radku: %c \n",pole[0][2]);
    printf("\nToto je 5. pismeno z 2. radku: %c \n",pole[1][4]);
   
    // -----uvolneni pameti -------
    free(data);
    free(pole);
   
    return(0);
   
}

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson