Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- RJESENJE PRVE GRUPE:
- Gusari prate kartu da dođu do skrivenog blaga. Međutim, bili su neoprezni pa su kartu zaprljali vinom.
- Cilj je napisati program koji će \emph{očistiti} kartu. Preciznije, zaprljani dio karte je zapisan u matrici
- znakova (\texttt{char}) tipa $m\times n$ ($m,n\leqslant 50$). Sa znakom \texttt{'X'} je označavan put, s \texttt{'*'} mrlja,
- te s \texttt{'0'} ostatak matrice.
- Put uvijek počinje iz gornjeg lijevog kuta matrice (mjesto $(0,0)$) te iz svake točke može ići dalje samo desno ili dolje, tj.~iz mjesta
- $(i,j)$ možemo ići ili u $(i+1,j)$ ili u $(i,j+1)$. Nadalje, put ne staje u tom dijelu karte već je kraj u nekoj točki ruba dane matrice.
- Mrlje su realizirane uvijek kvadratnom podmatricom tipa $2\times 2$ (čiji su svi elementi jednaki \texttt{'*'}) pri čemu su za
- barem jedno polje udaljene od ruba matrice, te se nikoje dvije mrlje ne dodiruju.
- Dakle, put ili ne prolazi uopće kroz mrlju ili točno postoji jedan ulaz i jedan izlaz puta iz mrlje.
- Ako put ne prolazi kroz mrlju, potrebno je postaviti sve elemente mrlje na \texttt{'0'}. U suprotnom, put je potrebno povezati tako da je
- potrebno najmanje znakova \texttt{'X'} (ukoliko postoji više mogućnosti, sami izaberite jedno od njih), dok se preostala polja postavljaju na \texttt{'0'}.
- Potrebno je napisati funkciju \texttt{ocisti} koja prima kao argument
- gore opisanu matricu znakova i njene dimenzije koju \emph{čisti} na gore opisan način. Napišite i dio koda koji demonstrira poziv funkcije, pri čemu
- možete pretpostaviti da su svi potrebni podaci već učitani.
- Za rjesenja preostalih grupa samo treba znakove 'X', '*' i '0' zamijeniti s odgovarajucim znakovima.
- NAPOMENA: prezentiramo tri rjesenja. Naravno, nisu to sve mogucnosti za rjesavanje zadatka. Na primjer, zadatak se elegantno moze rijesiti koriteci rekurzivnu
- funkciju. Probajte :)
- */
- #include <stdio.h>
- #include <stdlib.h>
- /*FUNKCIJA KOJA NIJE TREBALA ZA RJESENJE ZADATKA, ALI JE KORISTIMO ZA TESTIRANJE*/
- void ispis(char karta[][50], int m, int n)
- {
- int i, j;
- for(i=0; i<m; i++){
- for(j=0; j<n; j++){
- printf("%c ", karta[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }
- /*************************************************************/
- /*POMOCNA FUNKCIJA KOJA SE KORISTI U 1. I 2. RJESENJU*/
- /*polja mrlje stavljamo na neutralnu vrijednost '0'*/
- /*ne trebamo u argument stavljati dimenzije matrice jer znamo da je mrlja dimenzije 2x2 i da je udaljena od rubova*/
- void mrlju_na_nula(char karta[][50], int i, int j)
- {
- karta[i][j]=karta[i+1][j]=karta[i][j+1]=karta[i+1][j+1]='0';
- return;
- }
- /*************************************************************/
- /*RJESENJE 1: ocisti1 i pomocne funkcije makni_mrlju i mrlju_na_nulu*/
- /*Prolazimo kroz matricu i trazimo '*'. Kako pretrazujemo od lijevo prema
- desno, te od gore prema dolje, to je '*' na koju naidjemo sigurno gornje
- lijevo polje mrlje. Zatim cijelu mrlju stavimo na '0', a potom koristimo funkciju
- makni_mrlju da vidimo gdje ce tocno doci 'X'.*/
- void makni_mrlju(char karta[][50], int i, int j) //cesta greska je bila da se ovdje pise karta[50][50]
- {
- if(karta[i-1][j]=='X' && karta[i-1][j+1]!='X'){
- karta[i][j]='X';
- if(karta[i][j+2]=='X'){
- karta[i][j+1]='X';
- }
- else if(karta[i+2][j]=='X'){
- karta[i+1][j]='X';
- }
- else if(karta[i+1][j+2]=='X' || karta[i+2][j+1]=='X'){
- karta[i+1][j]='X';
- karta[i+1][j+1]='X';
- }
- }
- if(karta[i-1][j+1]=='X' && karta[i-1][j+2]!='X'){
- karta[i][j+1]='X';
- if(karta[i][j+2]!='X' && (karta[i+1][j+2]=='X' || karta[i+2][j+1]=='X')){
- karta[i+1][j+1]='X';
- }
- }
- if(karta[i][j-1]=='X' && karta[i+1][j-1]!='X'){
- karta[i][j]='X';
- if(karta[i+2][j]=='X'){
- karta[i+1][j]='X';
- }
- else if(karta[i][j+2]=='X'){
- karta[i][j+1]='X';
- }
- else if(karta[i+2][j+1]=='X' || karta[i+1][j+2]=='X'){
- karta[i+1][j]='X';
- karta[i+1][j+1]='X';
- }
- }
- if(karta[i+1][j-1]=='X' && karta[i+2][j-1]!='X'){
- karta[i+1][j]='X';
- if(karta[i+2][j]!='X' && (karta[i+2][j+1]=='X' || karta[i+1][j+2]=='X')){
- karta[i+1][j+1]='X';
- }
- }
- return;
- }
- void ocisti1(char karta[][50], int m, int n)
- {
- int i=0, j=0;
- for(i=0; i<m; i++)
- for(j=0; j<n; j++)
- if(karta[i][j]=='*'){
- mrlju_na_nula(karta,i,j);
- makni_mrlju(karta,i,j);
- }
- return;
- }
- /*************************************************************/
- /*RJESENJE 2: ocisti2 i pomocne funkcije prolaz_kroz_mrlju i mrlju_na_nulu*/
- /*Prolazimo kroz matricu i trazimo '*'. Kako pretrazujemo od lijevo prema
- desno, te od gore prema dolje, to je '*' na koju naidjemo sigurno gornje
- lijevo polje mrlje. Zatim cijelu mrlju stavimo na '0', a potom koristimo funkciju
- prolaz_kroz_mrlju koja vraca vrijednost 1 ako put prolazi kroz mrlju, te 0 ako ne
- prolazi. Ukoliko put prolazi kroz mrlju preko adrese se prenose indeksi mjesta ulaska
- u mrlju i izlaska iz mrlje.*/
- int prolaz_kroz_mrlju(char karta[][50], int i, int j, int* iulaz, int* julaz, int* iizlaz, int* jizlaz)
- {
- int prolazi=0;
- if(karta[i-1][j+1]=='X' && karta[i-1][j+2]!='X'){
- *iulaz=i;
- *julaz=j+1;
- prolazi=1;
- }
- else if(karta[i-1][j]=='X' && karta[i-1][j+1]!='X'){
- *iulaz=i;
- *julaz=j;
- prolazi=1;
- }
- if(karta[i+1][j-1]=='X' && karta[i+2][j-1]!='X'){
- *iulaz=i+1;
- *julaz=j;
- prolazi=1;
- }
- else if(karta[i][j-1]=='X' && karta[i+1][j-1]!='X'){
- *iulaz=i;
- *julaz=j;
- prolazi=1;
- }
- if(!prolazi)
- return 0;
- if(karta[i][j+2]=='X'){
- *iizlaz=i;
- *jizlaz=j+1;
- }
- else if(karta[i+1][j+2]=='X'){
- *iizlaz=i+1;
- *jizlaz=j+1;
- }
- else if(karta[i+2][j]=='X'){
- *iizlaz=i+1;
- *jizlaz=j;
- }
- else{
- *iizlaz=i+1;
- *jizlaz=j+1;
- }
- return 1;
- }
- void ocisti2(char karta[][50], int m, int n)
- {
- int i=0, j=0, iu, ju, ii, ji, k;
- for(i=0; i<m; i++)
- for(j=0; j<n; j++)
- if(karta[i][j]=='*'){
- mrlju_na_nula(karta,i,j);
- if(prolaz_kroz_mrlju(karta,i,j,&iu,&ju,&ii,&ji)){
- for(k=iu; k<=ii; k++)
- karta[k][ju]='X';
- for(k=ju; k<=ji; k++)
- karta[ii][k]='X';
- }
- }
- return;
- }
- /*************************************************************/
- /*RJESENJE 3: ocisti3*/
- /*Krecemo od mjesta (0,0) i pratimo put. Kad dodjemo do '*', onda odlucujemo gdje treba
- staviti 'X'.*/
- void ocisti3(char karta[][50], int m, int n)
- {
- int i=0, j=0, ipom, jpom; //i, j su brojaci, a ipom i jpom nam sluze za izlazak iz petlje (vidi dolje if)
- while(i<m && j<n){
- ipom=i;
- jpom=j;
- if(j+1<n && karta[i][j+1]=='X')
- j++;
- else if(i+1<m && karta[i+1][j]=='X')
- i++;
- else if(i+1<m && j+1<n && karta[i][j+1]=='*' && karta[i+1][j]=='0')
- karta[i][++j]='X';
- else if(i+1<m && j+1<n && karta[i+1][j]=='*' && karta[i][j+1]=='0')
- karta[++i][j]='X';
- else if(i+1<m && j+1<n && karta[i][j+1]=='*' && karta[i+1][j]=='*'){ //ovo se ne moze dogoditi u prvom koraku, ali se moze u kasnijim koracima pojaviti pa je bitno ovo dobro napisati da "sredimo" cijelu mrlju dobro
- if(karta[i][j+2]=='X')
- karta[i][++j]='X';
- else
- karta[++i][j]='X';
- }
- /*ako je donji uvjet ispunjen, znaci da nismo mijenjali poziciju sto znaci da smo dosli do kraja puta
- (ovo je potrebno jer put ne mora zavrsiti nuzno u mjestu (m-1,n-1)*/
- if(ipom==i && jpom==j)
- break;
- }
- /*ukoliko je ostalo '*', stavljamo ih na '0' jer smo vec stavili 'X' gdje je potrebno*/
- for(i=0; i<m; i++)
- for(j=0; j<n; j++)
- if(karta[i][j]=='*')
- karta[i][j]='0';
- return;
- }
- /*************************************************************/
- int main(void)
- {
- int m, n;
- char karta1[][50]={{'X','0','0','0','0','0','0','0'},
- {'X','X','*','*','X','*','*','0'},
- {'0','0','*','*','X','*','*','0'},
- {'0','0','0','0','X','X','X','X'},
- {'0','0','0','0','0','0','0','X'}};
- char karta2[][50]={{'X','0','0','0','0','0','0','0','0','0'},
- {'X','X','X','X','*','*','0','0','0','0'},
- {'0','*','*','0','*','*','0','*','*','0'},
- {'0','*','*','0','0','X','X','*','*','X'},
- {'0','0','0','0','0','0','0','0','0','X'}};
- printf("\n\nPrvi primjer:\n");
- m=sizeof(karta1)/sizeof(*karta1);
- n=sizeof(*karta1)/sizeof(**karta1);
- ispis(karta1,m,n);
- ocisti1(karta1,m,n);
- ispis(karta1,m,n);
- printf("\n\nDrugi primjer:\n");
- m=sizeof(karta2)/sizeof(*karta2);
- n=sizeof(*karta2)/sizeof(**karta2);
- ispis(karta2,m,n);
- ocisti1(karta2,m,n);
- ispis(karta2,m,n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement