Jump to content

vexyro

Active Members
  • Posts

    58
  • Joined

  • Last visited

Everything posted by vexyro

  1. #include <stdio.h> static int t[10]={-1}; /* vector care retine pozitia reginelor. t[i]=j inseamna regina la (i,j) */ void queens(int i); /* functia de backtracking */ int empty(int i); /* verifica daca reginele se ataca */ void print_solution(); /* afiseaza solutia gasita la pasul curent */ int main() { queens(1); /* porneste BK incepand cu linia 1 */ print_solution(); return 0; } void queens(int i) { for (t[i]=1; t[i] <= 8; t[i]++) /* itereaza prin toate coloanele */ { printf("i=%d\n",i); if (empty(i)) /* verifica daca la pasul curent (t[i]), regina de pe linia i se ataca cu alta de pe tabla */ { if (i == 8) /* daca nu se ataca cu nici una si s-au pus toate cele 8 regine */ { print_solution(); /* solutie */ exit(0); /* If this exit is commented, it will show ALL possible combinations */ } else queens(i + 1); /* se trece la urmatoarea linie din matrice si se incepe iar cu coloana 1 */ } } } int empty(int i) { int j; j=1; while ((t[i] != t[j]) && /* daca reginele nu se afla pe aceeasi coloana */ (abs(t[i] - t[j]) != (i-j)) && /* daca reginele nu se afla pe aceeasi diagonala */ (j < 8) /* daca nu s-a ajuns la ultima linie */ ) j++; /* treci la urmatoarea linie */ return ((i == j) ? 1 : 0); /* daca pana la ea insasi (regina) nu se ataca cu nicio alta regina (decat cu ea) atunci locul este "valid" */ /* returnul este echivalent cu: * * if (i == j) * return 1; * else * return 0; * */ } void print_solution() /* e clara */ { int i; for (i=1; i <= 8; i++) printf("t[%d] = [%d]\n", i, t[i]); } Sursa: Interview Questions: What is the 8 queens problem? Write a C program to solve it. P.S. ?tiu, e urât code-styling-ul dar mi-a fost sil? de formatare. Trage-l ?i tu într-un IDE ?i testeaz?-l Baft? la examen
  2. Probabil warchild, prin lume, se refer? la organiza?iile (gen KDE) care vin cu propunerea de proiecte (gen Digikam) care sunt sau nu acceptate de Google în program. Ulterior tu aplici la un proiect la acea organiza?ie ?i întradev?r implementezi ce ?i se cere. În momentul în care tu implementezi cerin?ele obligatorii po?i s? aduci feature-uri în proiect ?i sunt acceptate ?i ideile tale (evident dac? sunt relevante, utile, etc). Dar nu î?i interzice nimeni s? nu vii cu idei pentru proiect. Mai ales dac? ai lucrat un an în GSoC ?i anul urm?tor aplici pentru acela?i proiect, evident pe perioada out-of-GSoC tu po?i propune noi idei (chiar s? dezvol?i în continuare) pentru acea aplica?ie/proiect. De ce? Totul este open-source
  3. Conform documenta?iei Java se ?tie ca în Java, spre deosebire de C/C++ tipul de dat? long are o reprezentare pe 64bit (cu semn), iar int este reprezentat pe 32bit (tot cu semn). Bun. Acum hai s? vedem practic ce se intampl?. Lu?m cazu lui int Mai întâi ocup?m doar 16/32bit cu "1" int i = 0x0000ffff; System.out.println(i); //Output: 65535 System.out.println(Integer.toBinaryString(i)); //Output: 1111111111111111 System.out.println(Integer.toBinaryString(i).length()); //Output: 16 Hai s? vedem pentru 32/32bit umplu?i cu "1" int i = 0x7fffffff; System.out.println(i); //Output: 2147483647 System.out.println(Integer.toBinaryString(i)); //Output: 1111111111111111111111111111111 System.out.println(Integer.toBinaryString(i).length()); //Output: 31 int i = 0xffffffff; System.out.println(i); //Output: -1 System.out.println(Integer.toBinaryString(i)); //Output: 1111111111111111111111111111111 System.out.println(Integer.toBinaryString(i).length()); //Output: 32 Totul pare în regul? pân? acum. Rezultatul e clar de ce este "-1". S? vedem pentru long Mai întâi ocup?m doar 16/64bit cu "1" long i = 0xffff; System.out.println(i); //Output: 65535 System.out.println(Long.toBinaryString(i)); //Output: 1111111111111111 System.out.println(Long.toBinaryString(i).length()); //Output: 16 Ce se întampl? pentru 32/64bit umplu?i cu "1" devine suspect in cazul ( (a) long i = 0x7fffffff; System.out.println(i); //Output: 2147483647 System.out.println(Long.toBinaryString(i)); //Output: 1111111111111111111111111111111 System.out.println(Long.toBinaryString(i).length()); //Output: 31 ( long i = 0xffffffff; System.out.println(i); //Output: -1 System.out.println(Long.toBinaryString(i)); //Output: 1111111111111111111111111111111111111111111111111111111111111111 System.out.println(Long.toBinaryString(i).length()); //Output: 64 P?i long asta e lung sau e int ? Rezultatul teoretic nu ar fi trebuit s? fie ?sta ? System.out.println(i); //Output: 4294967295 System.out.println(Long.toBinaryString(i)); //Output: 11111111111111111111111111111111 System.out.println(Long.toBinaryString(i).length()); //Output: 32 Din ce am observat eu abia în cazul (i este transformat într-un QWord. Pân? atunci pare s? se comporte ca un DWord. B?nuiesc c? dac? exist? o exliplica?ie logic?, este una idioat? la care nu m-a? fi gândit (prea curând)
  4. @Patrunjel: 1. Pe Win nu comenteaz? nimic în leg?tura cu itoa dar pe Linux face mutre pentru c? nu este o func?ie standard. Ai putea sa încerci s? recompilezi cu sprintf(c,"%d",sir[n/2]); în loc de itoa(sir[n/2],c,10); ?i ar trebui s?-?i mearg?. 2. La început nu s-a precizat dac? numerele sunt sau nu pozitive. Normal c? pic? unele teste pentru c? eu unul nu am stat s? iau în considerare ?i acest aspect, dar se poate aplica un patch
  5. Solu?ie: #include <stdio.h> #include <stdlib.h> #include <string.h> char* s; char* s2; int N = 0, S = 0; int sir[100]; int produs() { char *c = strdup(s); int num1, num2; char op; num1 = atoi(strdup(s)); while (*s >= '0' && *s <= '9') s++; op = *s; while (op == '*') { s++; num2 = atoi(strdup(s)); while (*s >= '0' && *s <= '9') s++; op = *s; num1 *= num2; } return num1; } int suma() { int t1, t2; char op; int sgn = 1; if (*s == '-') { sgn = -1; } *s++; t1 = produs(); t1 *= sgn; op = *s++; while (op == '+' || op == '-') { t2 = produs(); switch (op) { case '+': t1 += t2; break; default : t1 -= t2; break; } op = *s++; } return t1; } void eval(int n) { int i; if (n == 2*N) { s = strdup(s2); if (suma() == S && *s2 != '*') printf("%s\n",s2); } else { char c[100]; for (i = 0; i < 3; i++) { itoa(sir[n/2],c,10); switch(i) { case 0: s2[n] = '+'; break; case 1: s2[n] = '-'; break; case 2: s2[n] = '*'; break; } s2[n+1] = '\0'; itoa(sir[n/2],c,10); strcat(s2,c); eval(n+2); } } } int main() { s=(char*) malloc(100*sizeof(char)); s2=(char*) malloc(100*sizeof(char)); int i; scanf("%d",&N); for (i = 0; i < N; i++) scanf("%d",&sir[i]); scanf("%d",&S); eval(0); return 0; } L.E. E valabil codul de mai sus ?i pentru opera?ii de împ?r?ire, în expresia dat? cu urm?toarele modific?ri: int produs() { char *c = strdup(s); int num1, num2; char op; num1 = atoi(strdup(s)); while (*s >= '0' && *s <= '9') s++; op = *s; while (op == '*') { s++; num2 = atoi(strdup(s)); while (*s >= '0' && *s <= '9') s++; op = *s; [COLOR="#FFFF00"]switch(op) { case '*': num1 *= num2; break; case '/': num1 /= num2; break; }[/COLOR] } return num1; } ?i void eval(int n) { int i; if (n == 2*N) { s = strdup(s2); if (suma() == S && *s2 != '*' [COLOR="#FFFF00"]&& *s2 != '/'[/COLOR]) printf("%s\n",s2); } else { char c[100]; for (i = 0; i < 3; i++) { itoa(sir[n/2],c,10); switch(i) { case 0: s2[n] = '+'; break; case 1: s2[n] = '-'; break; case 2: s2[n] = '*'; break; } s2[n+1] = '\0'; itoa(sir[n/2],c,10); strcat(s2,c); eval(n+2); } } }
  6. nu mai pune + la numar incepe ori cu 40... ori cu 0... referitor la freeSMScraze
  7. Test in Chrome + FF. Nu are VIP (cel putin asa imi arata mie) user: wormstein
×
×
  • Create New...