Dopolni tabelo
Sestavi metodo, ki zapolni dano tabelo z omejenimi obsegi in sicer
tocno v tistem opsegu kjer se nahaja poseben znak (%) - oznacevalec.
Namig
eno za risanje tabele ( dve zanki... ) eno za iskanje posebnega znaka (oznacevalca), ki se nahaja v dolocenem 'omejenem' obmocju kjer z mesta najdenega znaka v vseh moznih prostih smereh narisemo oznacevalce in se vrnemo v rekurzivno metodo, ki na mestu oznacevalca narise zeljeno polnilo ('+') in poklice prej omenjeno funkcijo, ki zopet poisce oznacevalec(ce), oznaci in tako dalje,...
Rešitev (C#)
class program {
private static char[,]RazpolozljiveSmeri(char [,] tab, int[]koordinatiZnaka, char znak) {
// Ta metoda oznaci vsa prosta mesta okoli posebnega znaka z le-tim
// koordinatiZnaka pretvorimo v krajsa naziva (x in y)
int x = koordinatiZnaka[0];
int y = koordinatiZnaka[1];
if (x>1 || x<10) { // je 'x' v okvirih tabele ?
if (tab[x-1, y]==' ') {
tab[x-1, y]=znak; // mozen je pomik navzgor
}
if (tab[x+1, y]==' ') {
tab[x+1, y]=znak; // mozen je pomik navzdol
}
}
if (y>1 || y<10) { // je 'y' v okvirih tabele ?
if (tab[x, y-1]==' ') {
tab[x, y-1]=znak; // mozen je pomik levo
}
if (tab[x, y+1]==' ') {
tab[x, y+1]=znak; // mozen je pomik desno
}
}
return tab;
}
private static char[,] PolniTabelo(char [,] tab, char oznacevalec) {
int [] koordinati = new int[2]; // Koordinati zapisemo v tabelo
int stejOznacevalce = 0;
for (int x=0; x<12; x++) { // Zunanja zanka - vrstice v tabeli
for (int y=0; y<12; y++) { // Notranja zanka - stolpci v tabeli
if (tab[x,y] == oznacevalec ) { // Smo nasli poseben znak ?
tab[x,y] = '+'; // Ce, potem zapolni to mesto...
koordinati[0] = x;
koordinati[1]= y; // ..zapomni si mesto..
stejOznacevalce++; // ..prepreci zakljucek
// in od tam oznaci vse proste smeri s posebnim znakom
RazpolozljiveSmeri(tab, koordinati, oznacevalec);//
}
}
}
if (stejOznacevalce == 0) {
return tab; // Ustavitveni pogoj....
}
return PolniTabelo(tab, oznacevalec); // ..sicer ponovi...
}
private static void NarisiTabelo(char [,] tab) {
Console.Write("\n\t"); // par prehodov v novo vrsto - preglednost...
for (int x=0; x<12; x++) { // risanje vrstic
for (int y=0; y<12; y++) { // risanje stolpcev
if ((x==0 || x==11) && y<11 ) // smo v zg. ali spod. vrstici ?
{ // Ta pogoj smo dodali le
Console.Write(tab[x,y] + "-"); // zato, da je crta okvirja bolj polna...
} // saj sta "-" in spodaj " " dodana le za vecjo preglednost
else {
Console.Write(tab[x,y] + " "); // ..tule pa risemo sicersnjo vrstico tabele
}
}
Console.Write("\n\t"); // prehod v novo vrstico
}
}
public static void Main(string[] args) {
// Izhodiscna tabela
char[,]tabela = new char [12,12] {{'+','-','-','-','-','-','-','-','-','-','-','+'},
{'|','*','*','*','*','*','*','*','*','*','*','|'},
{'|','*','*','*','*','*','*','*','*','*','*','|'},
{'|','*',' ',' ',' ',' ','*','*',' ',' ','*','|'},
{'|','*',' ',' ','*',' ','*',' ',' ',' ','*','|'},
{'|','*',' ',' ','*','*','*','*','*','%','*','|'},
{'|','*','*','*','*',' ',' ',' ',' ',' ','*','|'},
{'|','*',' ',' ','*',' ','*',' ','*',' ','*','|'},
{'|','*','*',' ','*',' ','*','*','*',' ','*','|'},
{'|','*',' ',' ','*',' ',' ',' ','*',' ','*','|'},
{'|','*','*','*','*','*','*','*','*','*','*','|'},
{'+','-','-','-','-','-','-','-','-','-','-','+'}
};
NarisiTabelo(tabela); // Narisemo izhodiscno tabelo...
// Kje se nahaja oznacevalec v tej tabeli ?
int []koordinatiOznacevalca = new int[2]; // Pozicijo zapisemo v tabelo 2 znakov
char posZnak = '%';
//Narisemo koncno tabelo:
NarisiTabelo( PolniTabelo( tabela, posZnak ));
Console.WriteLine("\n\tPritisni nekaj...");
Console.ReadKey(true);
}