SKAKAČ NAPADA - REŠENJE C KOD

Oblast: dvodimenzionalni nizovi - matrice

#include<stdio.h>
#include<string.h>

int main() {
// Unos koordinata pozicije skakača (red i kolona)
int m, n;
scanf("%d %d", &m, &n);

// Inicijalizacija table kao matrice stringova
char tabla[9][9][3];

// Popunjavanje table od reda 8 ka 1
for (int i = 8; i >= 1; i--) {
for (int j = 1; j <= 8; j++) {
if (i == m && j == n) { // Ako je trenutna pozicija skakač
int v = 0; // Pomoćna promenljiva za pomeranje kolona
for (int r = i + 2; r >= i - 2; r--) {
// Postavljanje '0' na poziciju skakača
strcpy(tabla[i][j], "0");
if (r > i) v++; // Pomeranje kolone nadesno
else if (r < i - 1) v--; // Pomeranje kolone nalevo
else if (r == i) {
// U istom redu kao skakač se postavlja '*'
strcpy(tabla[i][j], "*");
continue;
}
// Ignorisanje pozicija van granica table
if (r < 1 || r > 8) continue;
// Izračunavanje kolona za desno i levo napadnuto polje
int k1 = n + v; // Desno
int k2 = n - v; // Levo

// Generisanje oznaka polja (npr. 'c4')
char kol1 = 'a' + k1 - 1;
char kol2 = 'a' + k2 - 1;
char red = '0' + r;

// Napadnuto polje desno
char s1[3];
s1[0] = kol1;
s1[1] = red;
s1[2] = '\0';
// Napadnuto polje levo
char s2[3];
s2[0] = kol2;
s2[1] = red;
s2[2] = '\0';

// Postavljanje napadnutih polja na tablu
if (k1 <= 8) strcpy(tabla[r][k1], s1);
if (k2 >= 1) strcpy(tabla[r][k2], s2);
}
} else {
if (strlen(tabla[i][j]) == 0) {
// Popunjavanje ostalih polja sa '*'
strcpy(tabla[i][j], "*");
}
}
}
}

// Ispisivanje sadržaja table
for (int i = 8; i >= 1; i--) {
for (int j = 1; j <= 8; j++) {
printf("%s ", tabla[i][j]);
}
printf("\n");
}

return0;
}

Ključni delovi koda i objašnjenje

Inicijalizacija table:
string tabla[9][9];
​Kreira se dvodimenzionalni niz stringova dimenzija 9x9, koji će predstavljati šahovsku tablu. Iako tabla ima dimenzije 8x8, koristi se matrica 9x9 zbog lakšeg indeksiranja (indeksi idu od 1 do 8, što odgovara šahovskoj notaciji).Petlja za popunjavanje table:
for(int i=8; i>=1; i--)
{
for(int j=1; j<=8; j++)
{
Ova petlja prolazi kroz sve pozicije na šahovskoj tabli, počevši od donjeg reda (i=8) ka vrhu (i=1), i od leve ka desnoj koloni (j=1 do j=8).
​
Identifikacija pozicije skakača:
if(i==m && j==n)
Kada se dođe do pozicije skakača (m, n), program započinje proces označavanja polja koja skakač napada.
​
Označavanje polja koja napada skakač:
for(int r=i+2; r>=i-2; r--)
Ova petlja iterira kroz sve moguće redove koje skakač može napasti (dva reda iznad i dva ispod pozicije skakača). Promena varijable v služi za označavanje pomaka kolona u zavisnosti od trenutnog reda.
​
Označavanje pozicije skakača:
tabla[i][j]=" 0";
Na poziciji gde se nalazi skakač postavlja se " 0" kako bi se označilo da je to skakačeva pozicija.
Popunjavanje ostalih polja:
if((tabla[i][j]).length()==0)
{
tabla[i][j]=" *";
}
Sva ostala polja koja nisu napadnuta ili na kojima se ne nalazi skakač popunjavaju se zvezdicama (*).
Ispisivanje table:
for(int i = 8; i >= 1; i--)
{
for(int j = 1; j <= 8; j++)
{
printf("%s ", tabla[i][j]); // Ispis svakog elementa tabele
}
printf("\n"); // Ispis nove linije za sledeći red
}

Na kraju se tabla ispisuje tako da svaka linija predstavlja jedan red na šahovskoj tabli.
RezultatKao rezultat, na izlazu se dobija šahovska tabla sa oznakama polja koje skakač napada, pozicijom skakača označenom sa " 0", i ostalim poljima ispunjenim zvezdicama.
Ovaj program lepo prikazuje osnovne principe rada sa dvodimenzionalnim nizovima, manipulacije stringovima, i osnovne koncepte algoritama u C++.

Analiza optimalnosti koda

Optimizovan kod

#include<stdio.h>
#include<string.h>

int main() {
// Unos pozicije skakača (red i kolona)
int m, n;
scanf("%d %d", &m, &n);

// Matrica za predstavljanje šahovske table
char tabla[9][9];

// Definisanje svih mogućih skakačevih pomeraja
int dx[] = {2, 2, 1, 1, -2, -2, -1, -1};
int dy[] = {1, -1, 2, -2, 1, -1, 2, -2};

// Popunjavanje table sa početnim vrednostima
for (int i = 8; i >= 1; --i) {
for (int j = 1; j <= 8; ++j) {
if (i == m && j == n) {
// Skakačeva trenutna pozicija označena sa "0"
tabla[i][j] = " 0";
} else {
// Sva ostala polja pretpostavljamo kao nenapadnuta
tabla[i][j] = " *";
}
}
}

// Proveravanje polja koja skakač može napasti
for (int k = 0; k < 8; ++k) {
// Nove koordinate skakačevog poteza
int ni = m + dx[k];
int nj = n + dy[k];
if (ni >= 1 && ni <= 8 && nj >= 1 && nj <= 8) {
// Pretvaranje koordinata u šahovski format (npr. c4)
char kol = 'a' + nj - 1;
char red = '0' + ni;
tabla[ni][nj] = string(1, kol) + red;
}
}

// Ispisivanje šahovske table
for (int i = 8; i >= 1; --i) {
for (int j = 1; j <= 8; ++j) {
printf("%s ", tabla[i][j]);
}
printf("\n");
}

return0;
}

Poboljšanja u Optimizovanom Kodu

Ovako optimizovan kod je jednostavniji za razumevanje, brži u izvršavanju, i efikasniji u smislu korišćenja memorije i procesorskog vremena.