Sunteți pe pagina 1din 7

LICEUL TEOLOGIC ADVENTIST TEFAN DEMETRESCU

LUCRARE DE ATESTAT
N INFORMATICA

Profesor coordonator: Kos Tiberiu

Nume elev: Dragnea Andrei

2014

Cuprins:
Introducere.......................................................... pag. 2
Descrierea aplicaiei ............................................ pag. 3
Exemple............................................................... pag. 4
Descrierea modului de functionare...................... pag. 5
Bibliografie.......................................................... pag. 7

Introducere
Problema calului este o problema de logica care combina si cunostinte de matematica. Este distractiva si iti
pune mintea la lucru. pe langa modul clasic, aceasta problema se poate rezolva si folosind informatica si
limbajul de programare C++.

Descrierea aplicaiei
Se consider o tabl de ah cu n linii i n coloane, unde n = 4k + 1. Liniile acestei
table sunt numerotate de sus n jos ncepnd cu linia 1, iar coloanele sunt numerotate
de la stnga la dreapta ncepnd cu 1. n fiecare dintre cmpurile acestei table se
scrie cte un numr natural din mulimea {1, 2, , n2} dup urmtoarele reguli:
a) se pornete din colul aflat n poziia stnga sus al tablei i se avanseaz utiliznd
sritura calului
b) se merge orizontal ctre dreapta i n continuare, pe chenarul format din primele
dou linii, primele dou coloane, ultimele dou linii i ultimele dou coloane, n sensul
acelor de ceasornic;
c) se efectueaz mai multe tururi ale tablei, pn ce se umple ntregul chenar, fr s
se sar de dou ori n aceeai csu, fr s se sar n afara acestui chenar i fr s
rmn vreun cmp liber;
d) din poziia final n care s-a ajuns, trebuie s fie posibil sritura n colul din
stnga sus al ptratului rmas neacoperit;
e) se continu deplasarea n interiorul ptratului rmas neacoperit, folosind regulile
a), b), c), d) pn ce se ajunge la ptratul interior de latur 1 care va conine
valoarea n2.
Amintim c o sritur a calului const ntr-o deplasare de dou csue pe orizontal
urmat de o deplasare de o csu pe vertical sau ntr-o deplasare de dou csue
pe vertical urmat de o deplasare de o csu pe orizontal. Calul din figura
urmtoare poate ajunge printr-o sritur n oricare dintre cele 8 poziii haurate:

Exemple
De exemplu, pentru n=5, dup un tur al tablei, se obine urmtoarea acoperire parial:

Iar dup al doilea tur, se obine acoperirea parial:

Pentru n=9, acoperirea se realizeaz astfel:

Descrierea modului de functionare


void cal(int x,int y)
{if((x>=1)&&(y>=1)&&(x<=10)&&(y<=10)&&(t[x][y]==0))
{t[x][y]=1; k++; int w; system("cls"); afis();
drum[0][k]=x;
drum[1][k]=y;
cal(x-2,y-1);
cal(x-1,y-2);
cal(x+1,y-2);
cal(x+2,y-1);
cal(x+2,y+1);
cal(x+1,y+2);
cal(x-1,y+2);
cal(x-2,y+1);
}
}
Subprogramul void cal are rolul de a se asigura ca, prin miscarile lui calul ramane in spatiul tablei de sah si
nu il depaseste. De asemenea este un subprogram recursiv care constant verifica toate cele 8 posibilitati de
miscare ale calului si in caz ca nu are unde merge, calul se intoarce pe ultima pozitie si de acolo incearca alta
pozitie.

void afis()
{ for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
if(t[i][j]==1)
cout<<"*";
else
cout<<"0";
cout<<endl;

}
}

Subprogramul void afis afiseaza tabla de sah sub forma unei matrice, care este umpluta initial cu 0, si in
locul unde ajunge calul apare simbolul *. Subprogramul va afisa rand cu rand toata matricea.

int main()
{cal(2,2);
int cont=0;
for(int i=0;i<k;i++)
{
cout<<"{ "<<drum[0][i]<<" }-{ "<<drum[1][i]<<" } ";
cont++;
if(cont%5==0)
cout<<endl;
}
}
In programul principal este apelat subprogramul void cal dintr-o pozitie oarecare. De asemenea se afiseaza
toate pozitiile in care ajunge calul sub forma {x}-{y}, x fiind linia si y coloana.

Bibliografie
http://www.infoarena.ro/problema/horse
http://info.mcip.ro/?t=back
http://www.slideshare.net/guest8f8af90/problema-calului-presentation

S-ar putea să vă placă și