Advertisement
PopaLepo

Probleme BKT

Oct 5th, 2016
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.48 KB | None | 0 0
  1. Probleme BKT
  2.  
  3. 1) Anagramele unui cuvant
  4.  
  5. #include <iostream>
  6. #include <string.h>
  7. using namespace std;
  8. int n,x[100];
  9. char s[100];
  10. void citire(char s[100],int &n)
  11. {int i;
  12. cout<<"n = "; cin>>n;
  13. for(i=0;i<n;i++)
  14. cin>>s[i];}
  15.  
  16. int solutie(int k)
  17. {if(k==n  )
  18. return 1;
  19. else
  20. return 0;}
  21.  
  22. int valid(int k)
  23. {int i;
  24. for(i=1;i<k;i++)
  25. if(x[i]==x[k])
  26. return 0;
  27. return 1;}
  28.  
  29. void tipar(int k)
  30. {int i;
  31. for(i=1;i<=k;i++)
  32. cout<<s[x[i]-1]<<" ";
  33. cout<<endl;}
  34.  
  35. void BKT()
  36. {int k;
  37. k=1;
  38. x[k]=0;
  39. while(k!=0)
  40.  if(x[k]<n)
  41. {x[k]=x[k]+1;
  42.  if(valid(k))
  43.   if(solutie(k))
  44.     tipar(k);
  45.    else
  46.   {k++;
  47.    x[k]=0;}}
  48. else
  49. k--;}
  50. int main()
  51. { citire(s,n);
  52. BKT();
  53. return 0;}
  54.  
  55. 2) Problema parantezelor
  56.  
  57. #include <iostream>
  58. using namespace std;
  59. int x[100], n;
  60. void citire(int &n)
  61. {
  62.     cout<<"n= "; cin>>n;
  63. }
  64. void numara(int k, int &nr1, int &nr0)
  65. {
  66.     int i;
  67.     for(int i=1; i<=k; i++)
  68.         if(x[i]==1)
  69.           nr1++;
  70.         else
  71.            nr0++;
  72. }
  73. int sol(int k)
  74. {
  75.     if(k==n && x[k]==0)
  76.        return 1;
  77.  return 0;
  78. }
  79. int valid(int k)
  80. {
  81.     int nr1=0,nr0=0;
  82.     numara(k, nr1, nr0);
  83.     if(nr1>n/2)
  84.       return 0;
  85.       if(x[1]==0)
  86.          return 0;
  87.     if(nr1<nr0)
  88.      return 0;
  89.  return 1;
  90.  
  91. }
  92. void tipar(int k)
  93. {
  94.     cout<<"Solutie: "<<endl;
  95.     for(int i=1; i<=k; i++)
  96.        if(x[i]==1)
  97.           cout<<"(";
  98.         else
  99.            cout<<")";
  100.     cout<<endl;
  101.  
  102. }
  103. void backt()
  104. {
  105.     int k=1;x[k]=-1;
  106.     while(k!=0)
  107.       if(x[k]<1)
  108.         {
  109.             x[k]=x[k]+1;
  110.             if(valid(k))
  111.               {if(sol(k))
  112.                tipar(k);
  113.                else
  114.                {
  115.                    k++;
  116.                    x[k]=-1;
  117.                }
  118.               }
  119.         }
  120.         else
  121.         k--;
  122.  
  123. }
  124. int main()
  125. {
  126.     citire(n);
  127.     if(n%2!=0)
  128.     cout<<"nu are solutie ";
  129.     else
  130.      backt();
  131. }
  132.  
  133. 3) Problema turelor
  134.  
  135. #include <iostream>
  136. using namespace std;
  137. int a[100][100],n,x[100],i,j;
  138.  
  139. int solutie(int k)
  140. {if(k==n)
  141. return 1;
  142. else
  143. return 0;}
  144.  
  145. int valid(int k)
  146. {int i;
  147. for(i=1;i<k;i++)
  148. if(x[i]==x[k])
  149. return 0;
  150. return 1;}
  151.  
  152. void tipar(int k)
  153. {int i;
  154. for(i=1;i<=n;i++)
  155. {cout<<endl;
  156. for(j=1;j<=n;j++)
  157. if(j==x[i])
  158. cout<<1;
  159. else
  160. cout<<0;}
  161. cout<<endl;}
  162.  
  163. void BKT()
  164. {int k;
  165. k=1;
  166. x[k]=0;
  167. while(k!=0)
  168.  if(x[k]<n)
  169. {x[k]=x[k]+1;
  170.  if(valid(k))
  171.   if(solutie(k))
  172.     tipar(k);
  173.    else
  174.   {k++;
  175.    x[k]=0;}}
  176. else
  177. k--;}
  178. int main()
  179. { cout<<"n = ";
  180. cin>>n;
  181. for(i=1;i<=n;i++)
  182. for(j=1;j<=n;j++)
  183. a[i][j]=0;
  184. BKT();
  185. return 0;}
  186.  
  187. 4) Toate numerele care se pot forma din n cifre citite mai mici sau egale cu d
  188.  
  189. #include <iostream>
  190. using namespace std;
  191. int v[100], x[100], n, d;
  192. void citire(int v[100], int &n, int &d)
  193. {
  194.     cout<<"Nr. de cifre: "; cin>>n;
  195.     cout<<"d= "; cin>>d;
  196.     cout<<"Cifrele sunt: ";
  197.     for(int i=1; i<=n; i++)
  198.         cin>>v[i];
  199. }
  200. int numar(int k)
  201. {
  202.     int nr=0;
  203.     for(int i=1; i<=k; i++)
  204.         nr=nr*10+v[x[i]];
  205.     return nr;
  206. }
  207. int sol(int k)
  208. {
  209.     if(numar(k)<=d)
  210.         return 1;
  211.     else
  212.         return 0;
  213. }
  214. int valid(int k)
  215. {
  216.     if(numar(k)>d)
  217.         return 0;
  218.     if(k==1 && v[x[k]]==0)
  219.         return 0;
  220.     return 1;
  221. }
  222. void tipar(int k)
  223. {
  224.     cout<<"Solutie: ";
  225.     for(int i=1; i<=k; i++)
  226.         cout<<v[x[i]];
  227.     cout<<endl;
  228. }
  229. void backt()
  230. {
  231.     int k=1; x[k]=0;
  232.     while(k!=0)
  233.         if(x[k]<n)
  234.     {
  235.         x[k]=x[k]+1;
  236.         if(valid(k))
  237.         {
  238.             if(sol(k))
  239.                 tipar(k);
  240.          k++;
  241.          x[k]=0;
  242.         }
  243.     }
  244.     else
  245.         k--;
  246. }
  247. int main()
  248. {
  249.     citire(v, n, d);
  250.     backt();
  251.     return 0;
  252. }
  253.  
  254. 5) toate numerele de m cifre care se pot forma cu toate cele n cifre citite ( m>=n )
  255.  
  256. #include <iostream>
  257. using namespace std;
  258. int n,x[100],m,a[100];
  259. void citire(int &n,int &m,int a[100])
  260. {cout<<"n=";
  261. cin>>n;
  262. cout<<"m= ";
  263. cin>>m;
  264. cout<<"Cifrele ";
  265. for(int i=1;i<=n;i++)
  266.    cin>>a[i];
  267. }
  268. int nr(int k,int n,int m)
  269. {int OK=0;
  270. for(int i=1;i<=n;i++)
  271. for(int j=1;j<=m;j++)
  272. {if(a[i]==x[j])
  273.     {OK=OK+1;
  274.         j=m+1;
  275.     }
  276. }
  277.     return OK;
  278. }
  279. int valid(int k)
  280. {for(int i=1;i<k;i++)
  281. if(x[i]==x[k])
  282. return 0;
  283. return 1;}
  284. int sol(int k)
  285. {if(k==m && nr(k,n,m)==n)
  286. return 1;
  287. return 0;}
  288. void tipar(int k)
  289. {for(int i=1;i<=k;i++)
  290. cout<<x[i]<<" ";
  291. cout<<endl;
  292. }
  293. void bkt()
  294. {int k=1;
  295. x[k]=0;
  296. while(k!=0)
  297. if(x[k]<9)
  298. {x[k]=x[k]+1;
  299. if(valid(k))
  300. if(sol(k))
  301. tipar(k);
  302. else
  303. {k++;
  304. x[k]=0;}}
  305. else k--;}
  306. int main()
  307. {citire(n,m,a);
  308. bkt();
  309.     return 0;
  310. }
  311.  
  312. 6) Toate posibilitatile distribuirii a n obiecte intre 2 persoane
  313.  
  314. #include <iostream>
  315. using namespace std;
  316. int n,p,x[100],A[100];
  317. void citire(int &n,int &p,int A[100])
  318. { cout<<"n = ";
  319. cin>>n;
  320. cout<<"p = ";
  321. cin>>p;
  322. for(int i=1;i<=n;i++)
  323. A[i]=i;}
  324.  
  325. int valid(int k)
  326. {
  327. if(k>1&&(x[k-1]>=x[k]))
  328. return 0;
  329. return 1;}
  330.  
  331. int sol(int k)
  332. {if(k==p)
  333. return 1;
  334.     return 0;
  335. }
  336.  
  337. void tipar(int k)
  338. {int i,j,OK;
  339. cout<<"Persoana 1 : ";
  340. for(i=1;i<=k;i++)
  341. cout<<A[x[i]]<<" ";
  342. cout<<"   Persoana 2 : ";
  343. for(j=1;j<=n;j++)
  344. {
  345.     OK=1;
  346.     for(i=1;i<=k;i++)
  347.            if(A[x[i]]==j)
  348.            OK=0;
  349.     if(OK)
  350.         cout<<j<<" ";
  351. }
  352. cout<<endl;}
  353.  
  354. void BKT()
  355. {int k;
  356. k=1;
  357. x[k]=0;
  358. while(k!=0)
  359. if(x[k]<n)
  360. {x[k]=x[k]+1;
  361. if(valid(k))
  362. if(sol(k))
  363. tipar(k);
  364. else
  365. {k++;
  366. x[k]=0;}}
  367. else
  368. k--;}
  369.  
  370. int main()
  371. { citire(n,p,A);
  372. BKT();
  373. return 0;}
  374.  
  375. 7) Exemplu generare ( a nr pare , cel mult n cifre )
  376.  
  377. #include <iostream>
  378. #include <cmath>
  379. using namespace std;
  380. int a[100], x[100], n, y;
  381. void citire( int a[100], int &n, int &y)
  382. {
  383.     cout<<"n= "; cin>>n; y=pow(10, n);
  384.     cout<<"Pare: ";
  385.    a[1]=0;
  386.    a[2]=2;
  387.    a[3]=4;
  388.    a[4]=6;
  389.    a[5]=8;
  390. }
  391. int numar(int k)
  392. {
  393.     int nr=0;
  394.     for(int i=1; i<=k; i++)
  395.         nr=nr*10+a[x[i]];
  396.     return nr;
  397. }
  398. int sol(int k)
  399. {
  400.     if(numar(k) <= y )
  401.         return 1;
  402.     else
  403.         return 0;
  404. }
  405. int valid(int k)
  406. {
  407.     if(numar(k) > y)
  408.         return 0;
  409.     if( (k==1) && (a[x[k]]==0) )
  410.         return 0;
  411.     return 1;
  412. }
  413. void tipar(int k)
  414. {
  415.     cout<<"Solutie: ";
  416.     for(int i=1; i<=k; i++)
  417.         cout<<a[x[i]];
  418.     cout<<endl;
  419. }
  420. void backt()
  421. {
  422.     int k=1; x[k]=0;
  423.     while(k!=0)
  424.         if(x[k]<5)
  425.     {
  426.         x[k]=x[k]+1;
  427.         if(valid(k))
  428.         {
  429.             if(sol(k))
  430.               tipar(k);
  431.             k++;
  432.             x[k]=0;
  433.         }
  434.     }
  435.     else
  436.         k--;
  437. }
  438. int main()
  439. {
  440.    citire(a, n, y);
  441.    backt();
  442.    return 0;
  443. }
  444.  
  445. 8) Partitii cu m submultimi
  446.  
  447. #include <iostream>
  448. using namespace std;
  449. int x[100],m,n,a[100],v[100];
  450. void citire(int &n,int &m)
  451. {cout<<"n= ";
  452. cin>>n;
  453. cout<<"m= ";
  454. cin>>m;
  455. for(int i=1;i<=n;i++)
  456. {cin>>a[i];
  457. }
  458. }
  459. int valid(int k)
  460. {return 1;}
  461. int cautare(int b,int k)
  462. {
  463.     for(int i=1;i<=k;i++)
  464.     if(x[i]==b)
  465.     return 1;
  466.     return 0;
  467. }
  468. int sol(int k)
  469. {if(k!=n)
  470. return 0;
  471. for(int i=1;i<=m;i++)
  472. if(cautare(i,k)==0)
  473. return 0;
  474. return 1;}
  475. void tipar(int k)
  476. {for(int i=1;i<=m;i++)
  477.     {cout<<"{";
  478.     for(int j=1;j<=n;j++)
  479.        if(x[j]==i)
  480.     cout<<j<<" ";
  481.     cout<<"} ";}
  482.     cout<<endl;
  483.     }
  484. void bkt()
  485. {int k=1;
  486.     x[k]=0;
  487.     while(k!=0)
  488.     if(x[k]<m && k<=n)
  489.     {x[k]=x[k]+1;
  490.     if(valid(k))
  491.         if(sol(k))
  492.     tipar(k);
  493.         else {k++;
  494.         x[k]=0;}}
  495.         else k--;
  496.     }
  497. int main()
  498. {citire(n,m);
  499. bkt();
  500.     return 0;
  501. }
  502.  
  503. 9) Bila care trebuie sa ajunga la marginea terenului
  504.  
  505. #include <iostream>
  506. #include <fstream>
  507. using namespace std;
  508. int Traseu[100][100],iini,jini,ifin,jfin,A[100][100],n,m;
  509. int pas=1,ic,jc,oriz[8]={-1,0,1,0,-1,1,1,-1},vert[8]={0,1,0,-1,1,1,-1,-1};
  510. ifstream f("in.txt");
  511. ofstream g("out.txt");
  512. void citire(int &n,int &m,int &iini,int &jini, int A[100][100])
  513. {
  514. f >> n >> m >> iini >> jini;
  515. for(int i=1;i<=n;i++)
  516. for(int j=1;j<=m;j++)
  517. f >> A[i][j];
  518. }
  519. void tipar()
  520. {
  521. g << "Solutie: "<<endl;
  522. for(int i=1;i<=n;i++)
  523. {
  524. for(int j=1;j<=m;j++)
  525. g << Traseu[i][j]<< " ";
  526. g << endl;
  527. }
  528. g <<endl;
  529. }
  530. void backplan(int ic,int jc,int pas)
  531. {
  532. int k,inou,jnou;
  533. for(k=0;k<8;k++)
  534. {
  535. inou=ic+oriz[k];
  536. jnou=jc+vert[k];
  537. if(inou>=1 && inou<=n && jnou>=1 && jnou<=m)
  538. if(A[inou][jnou]<A[ic][jc] && Traseu[inou][jnou]==0)
  539. { Traseu[inou][jnou]=pas;
  540. if(jnou==1 || jnou==m || inou==1 || inou==n)
  541. tipar();
  542. else
  543. backplan(inou,jnou,pas+1);
  544. Traseu[inou][jnou]=0;
  545. }
  546. }
  547. }
  548. int main()
  549. {
  550. citire(n,m,iini,jini,A);
  551. Traseu[iini][jini]=1;
  552. backplan(iini,jini,2);
  553. return 0;
  554. }
  555. int main()
  556. {
  557. citire(n,m,iini,jini,ifin,jfin,A);
  558. Traseu[iini][jini]=1;
  559. backplan(iini,jini,2);
  560. return 0;
  561. }
  562.  
  563. 10) Paritii ( submultimi cu sume egale )
  564. #include <iostream>
  565. using namespace std;
  566. int x[100],n,a[100],S=0;
  567. void citire(int &n)
  568. {cout<<"n= ";
  569. cin>>n;
  570. for(int i=1;i<=n;i++)
  571. {cin>>a[i];S+=a[i];
  572. }
  573. }
  574. int suma1(int k)
  575. {int s=0;
  576.  for(int i=1;i<=k;i++)
  577.  if(x[i]==1)
  578.  s=s+a[i];
  579. return s;
  580. }
  581. int suma2(int k)
  582. {int s=0;
  583.  for(int i=1;i<=k;i++)
  584.  if(x[i]==2)
  585.  s=s+a[i];
  586. return s;
  587. }
  588. int suma3(int k)
  589. {int s=0;
  590.  for(int i=1;i<=k;i++)
  591.  s=s+x[i];
  592. return s;
  593. }
  594. int valid(int k)
  595. {if(suma1(k)<=S/2 && suma2(k)<=S/2)
  596. return 1;
  597. return 0;   }
  598. int sol(int k)
  599. {if(k==n && suma1(k)==suma2(k))
  600. return 1;
  601. return 0;}
  602. void tipar(int k)
  603. {for(int i=1;i<=2;i++)
  604.     {cout<<"{";
  605.     for(int j=1;j<=n;j++)
  606.        if(x[j]==i)
  607.     cout<<j<<" ";
  608.     cout<<"}";}
  609.     cout<<endl;
  610.     }
  611. void bkt()
  612. {int k=1;
  613.     x[k]=0;
  614.     while(k!=0)
  615.     if(x[k]<2&& k<=n)
  616.     {x[k]=x[k]+1;
  617.     if(valid(k))
  618.         if(sol(k))
  619.     tipar(k);
  620.         else {k++;
  621.         x[k]=0;}}
  622.         else k--;
  623.     }
  624. int main()
  625. {citire(n);
  626. bkt();
  627.     return 0;
  628. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement