Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.15 KB | None | 0 0
  1. //PETRUSCA BOGDAN-MIHAI
  2. //SERIA: 313CB
  3. #include <stdio.h>
  4. #include <math.h>
  5. unsigned long long is_set(unsigned long long number,int i)
  6. {
  7.     unsigned long long mask=1;
  8.     mask<<=i;
  9.     return  (number&mask)!=0;
  10. }
  11. void print_bits (unsigned long long number)
  12. {
  13.     int i;
  14.     for(i=63;i>=0;i--)
  15.     {
  16.         if(is_set(number,i))
  17.             printf("#");
  18.         else
  19.             printf(".");
  20.         if(i%8==0)
  21.             printf("\n");
  22.     }
  23. }
  24. int miscStanga(unsigned long long piesa, unsigned long long n,int mutare)
  25. {
  26.     mutare=-mutare;
  27.     int bitStanga,nr=0,verif=0;
  28.     int val=0;
  29.     while(1)
  30.     {
  31.         for(bitStanga=7; bitStanga<=63; bitStanga=bitStanga+8)
  32.         {
  33.             if(is_set(piesa, bitStanga)==1 || ((piesa & n) != 0) )
  34.             {
  35.                 verif=1;
  36.                 if((piesa&n) != 0)
  37.                     val--;
  38.                 break;
  39.             }
  40.         }
  41.  
  42.             if(verif==0)
  43.                 nr++;
  44.             else
  45.                 break;
  46.  
  47.         piesa<<=1;
  48.     }
  49.     if(mutare<(nr+val))
  50.         return mutare;
  51.     else
  52.         return nr+val;
  53. }
  54.  
  55. int miscDreapta(unsigned long long piesa, unsigned long long n,int mutare)
  56. {
  57.     int bitDreapta,nr=0,verif=0;
  58.         int val=0;
  59.     while(1)
  60.     {
  61.         for(bitDreapta=0;bitDreapta<=56;bitDreapta=bitDreapta+8)
  62.         {
  63.             if(is_set(piesa,bitDreapta)==1 || ((piesa&n) != 0) )
  64.             {
  65.                 verif=1;
  66.                 if((piesa&n) != 0)
  67.                     val=-1;
  68.                 break;
  69.             }
  70.         }
  71.             if(verif==0)
  72.                 nr++;
  73.             else
  74.                 break;
  75.         piesa>>=1;
  76.     }
  77.     if(mutare<(nr+val))
  78.         return mutare;
  79.     else
  80.         return nr+val;
  81. }
  82.  
  83. unsigned long long rmvLine(int *l_elim, unsigned long long n)
  84. {
  85.     int liniePlina=0, val,i,j;
  86.     unsigned long long rez=n;
  87.     for(i=0; i<=7; i++)
  88.     {
  89.         val=1;
  90.         liniePlina=0;
  91.         //for-ul de mai jos gaseste ce linie este plina de 1
  92.         for(j=8*i; j<8*(i+1); j++)
  93.         {
  94.             if(is_set(n,j))
  95.                  continue;
  96.             else
  97.                 val=0;//val e 0 cand linie are cel putin un .
  98.         }
  99.         if(val == 1)
  100.         {
  101.             //pe variabila liniePlina o maresc cu unu iar in if-ul de mai jos
  102.             //o scad cu unu pentru a intra in respectivul if daca linia ce
  103.             //trebuie eliminata este prima adica daca i=0
  104.             liniePlina=i+1;
  105.             *l_elim = (*l_elim) + 1;
  106.              i--;
  107.         }
  108.             //printf("%s", "ma printez");
  109.         if(liniePlina!=0)
  110.         {
  111.             int k;
  112.             //am explicat mai sus de ce scad cu unu
  113.             liniePlina--;
  114.             ;
  115.             unsigned long long u=255,v=0, v2=0;
  116.             //in variabila v umplu cu 1 liniile de sub linia
  117.             //ce trebue eliminata
  118.             for(k=0; k<liniePlina; k++)
  119.                 v = v | (u<<(k*8));
  120.             //in variabila v2 umplu cu 1 liniile de deasupra
  121.             //liniei ce trebuie eliminate
  122.             for(k=liniePlina+1; k<=7; k++)
  123.                 v2= v2 | (u<<(k*8));
  124.             //creez variabila t astfel incat sa se salveze harta
  125.             //de sub linia ce trebuie eliminata, iar deasupra liniei
  126.             //sa fie 0
  127.             unsigned long long t=(n&v);
  128.             //creez variabila t2 astfel incat sa se salvezeze harta
  129.             //de deasupra liniei ce trebuie eliminate, iar sub linie sa fie 0
  130.             //shiftez cu 8 t2 pentru a se elimnata linia pe care
  131.             //o vrem eliminata
  132.             unsigned long long t2=(n&v2);
  133.             t2=t2>>8;
  134.             //combin ambele variabile si returnez harta fara linia respectiva
  135.             n=t|t2;
  136.             rez = n;
  137.         }
  138.     }
  139.     return rez;
  140. }
  141. float score(unsigned long long n,int linii_eliminate)
  142. {
  143.     float score=0;
  144.     int i,x=0;
  145.     //in variabila x se numara cate 0-uri sunt
  146.     for(i=63;i>=0;i--)
  147.         if(is_set(n,i)==0)
  148.             x++;
  149.     score=sqrt(x)+pow(1.25,linii_eliminate);
  150.     return score;
  151. }
  152. int main()
  153. {
  154.     unsigned long long n,piesa,limit=128;
  155.     limit<<=56;
  156.     int i,nrPiesa=0,linii_eliminate=0;
  157.     scanf("%llu",&n);
  158.     scanf("%d",&nrPiesa);
  159.     int verif=0;
  160.     for(i=1;i<=nrPiesa;i++)
  161.     {
  162.         //acest verif ia valoarea 1 daca se citesc piese
  163.         verif=1;
  164.         int cnt=0;
  165.         unsigned long long aux;
  166.         int j,ok=0;
  167.         scanf("%llu",&piesa);
  168.         //instructiunea de mai jos verifica daca piesa mai are loc pe harta.
  169.         if(((piesa<<56)&n)!=0)
  170.             {
  171.                 print_bits(n);
  172.                 printf("\n");
  173.                 printf("GAME OVER!\n");
  174.                 printf("Score:%.2f\n", score(n,linii_eliminate));
  175.                 return 0;
  176.             }
  177.         //instructiunea de mai jos afiseaza harta prima data, inainte de
  178.         //inserarea pieselor in ea
  179.         if(i==1)
  180.         {
  181.             print_bits(n);
  182.             printf("\n");
  183.         }
  184.         //instructiunea de mai jos face prima mutare pentru o piesa de 2 linii
  185.         if(piesa>255)
  186.         {
  187.             aux=piesa;
  188.             int mutare;
  189.             scanf("%d", &mutare);
  190.             cnt++;
  191.             printf("\n");
  192.             if(mutare<0)
  193.             {
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.             //sugi pula!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  202.  
  203.  
  204.                
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.                 print_bits(n|((piesa<<56)<<miscStanga((piesa<<56),n,mutare)));
  219.                 piesa<<=miscStanga((piesa<<56),n,mutare);
  220.             }
  221.             else
  222.             {
  223.                 print_bits(n|((piesa<<56)>>miscDreapta((piesa<<56),n,mutare)));
  224.                 piesa>>=miscDreapta((piesa<<56),n,mutare);
  225.             }
  226.  
  227.             printf("\n");
  228.             piesa<<=48;
  229.         }
  230.         else
  231.         {
  232.             aux=piesa;
  233.             piesa<<=56;
  234.         }
  235.         for(j=0;j<=7;j++)
  236.         {
  237.             int mutare;
  238.             scanf("%d",&mutare);
  239.             cnt++;
  240.             //instructiunile de mai jos fac mutarile pe orizontala
  241.             if((piesa&n)==0)
  242.             {
  243.                 if(mutare<0)
  244.                 {
  245.                     print_bits(n|(piesa<<miscStanga(piesa,n,mutare)));
  246.                     piesa<<=miscStanga(piesa,n,mutare);
  247.                 }
  248.                 else
  249.                 {
  250.                     print_bits(n|(piesa>>miscDreapta(piesa,n,mutare)));
  251.                     piesa>>=miscDreapta(piesa,n,mutare);
  252.                 }
  253.                 printf("\n");
  254.                 //instructiunea de mai jos opreste piesa de 2 linii
  255.                 //pe ultima linie hartii
  256.                 if((aux>255)&&(j==6))
  257.                     break;
  258.                 //instructiunea de mai jos verifica in avans daca
  259.                 //intre piesa si harta nu este colizune atunci cand
  260.                 //ea este coborata mai jos. daca nu exista coliziune,
  261.                 //atunci ea este coborata
  262.                 if(!(j==7))
  263.                 {
  264.                     if(((piesa>>8)&n)==0)
  265.                         piesa>>=8;
  266.  
  267.                     else
  268.                     {
  269.                         //while-ul de mai jos citeste in gol mutarile care
  270.                         //nu s-au efectuat datorita opririi piesei
  271.                         while(cnt<=7)
  272.                         {
  273.                             scanf("%d",&mutare);
  274.                             cnt++;
  275.  
  276.                         }
  277.                         break;
  278.                     }
  279.                 }
  280.             }
  281.             else
  282.             {
  283.                 //se insereaza piesa in harta
  284.                 n=n|piesa;
  285.                 ok=1;
  286.                 break;
  287.             }
  288.         }
  289.         if(!(ok==1))
  290.             n|=piesa;
  291.         int verif = linii_eliminate;
  292.         //salveza in n valoarea returnata de rmvLine
  293.         n = rmvLine(&linii_eliminate, n);
  294.         if(verif!=linii_eliminate)
  295.             print_bits(n);
  296.     }
  297.     //daca nu se citesc piese verif ramane 0 si se afiseaza harta
  298.     if(verif==0)
  299.         print_bits(n);
  300.     printf("\n");
  301.     printf("GAME OVER!\n");
  302.     printf("Score:%.2f\n", score(n,linii_eliminate));
  303.     return 0;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement