-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTetriBit.c
More file actions
192 lines (181 loc) · 4.48 KB
/
Copy pathTetriBit.c
File metadata and controls
192 lines (181 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/* Argint Adrian-Costel
313 CB */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void harta( unsigned long long H ) // Afiseaza harta.
{
int i, x;
for (i = 63; i >= 0; i--){
x = H >> i;
if (x & 1)
printf("#");
else
printf(".");
if (i % 8 == 0)
printf ("\n");
}
printf ("\n");
}
int verificareStanga (unsigned long long P){ //verif mutare st/dr
unsigned long long v;
v = 9259542123273814144UL; //numar coloana stanga 1
if( (v & P) > 0 )
return 1;
else
return 0;
}
int verificareDreapta (unsigned long long P){ //verif mutare st/dr
unsigned long long v;
v = 72340172838076673UL; // numar coloana dreapta 1
if ( (v & P) > 0 )
return 1;
else
return 0;
}
unsigned long long eliminare( unsigned long long H ) // Elimina liniile complete
{
int i, c = 0;
unsigned long long mask, maskH, x;
for (i = 63; i >= 0; i--)
{
x = H >> i;
if (x & 1){
c++;
}
if (i % 8 == 0){
if(c == 8 && i > 7){
mask = (H << (64 - i));
maskH = H >> (i + 8);
H = (maskH << i) | (mask >> (64 - i));
break;
}
else {
if(c == 8){
H = H >> 8;
}
}
c = 0;
}
}
return H;
}
int zerouri( unsigned long long H ) // Numara zerourile.
{
int i, bit, c = 0;
for (i = 63; i >= 0; i--){
bit = H >> i;
if ((bit & 1 )== 0)
c++; // Contor
}
return c;
}
int main ()
{
unsigned long long H, maskP, copieH;
long long v[100][9];
double scor;
int M, i, j, k, ok, c = 0, liniiComplete = 0;
scanf("%llu", &H); //Introducem harta
scanf("%d", &M); //Introducem nr de piese
for (i = 0; i < M; i++)
for (j = 0; j < 9; j++)
scanf("%lld", &v[i][j]); // Se salveaza intr-o matrice de M linii si 9 coloane piesa + 8 mutari
harta(H);
for (i = 0; i < M; i++){ //fiecare piesa trece pe primul rand al hartii
maskP = v[i][0] << 56; //Salvam prima linie din piesa
if (v[i][0]>128) //Piesa mai mare de o linie
c = 1;
for (j = 1; j < 9; j++){ // piesa de la 1 la 8
ok = 1; //ok este variabila conditie, daca piesa are loc pe harta
if (v[i][j] == 0 && (maskP & H) == 0) { //fara mutare stanga/dreapta
copieH = H | maskP; // se face adaugarea piesei
harta(copieH);
ok = 0;
}
if (v[i][j] > 0 ){ //mutare la dreapta
for (k = 1; k <=v[i][j]; k++){
if ( (maskP & H) == 0){
if((verificareDreapta(maskP) == 0) && (((maskP >> 1) & H) == 0)){
maskP = maskP >> 1;
v[i][0] = v[i][0] >> 1;
ok = 0;
}
else {
ok = 0;
}
}
else
break;
}
if(ok == 0){
copieH = H | maskP;// se face adaugarea piesei
harta(copieH);
}
else{
break;
}
}
if (v[i][j] < 0 ){ //mutare la stanga
v[i][j] = abs(v[i][j]);
for (k = 1; k <= v[i][j]; k++){
if ( (maskP & H) == 0){
if( ((maskP << 1) & H) == 0 && (verificareStanga(maskP) == 0) ){
maskP = maskP << 1; //Se muta cate o data atat mask
v[i][0] = v[i][0] << 1; //cat si copia piesa efectiv
ok = 0;
}
else{
ok = 0;
}
}
else
break;
}
if(ok ==0){
copieH = H | maskP; // se face adaugarea piesei
harta(copieH);
}
else{
break;
}
}
if(c){ //Daca e de 2 cifre, dupa prima mutare, se afiseaza toata piesa
if ( ((maskP >> 8) & H )== 0 ){
maskP = v[i][0]<< 48;
c--;
}
else{
break;
}
}
else
maskP = maskP >> 8;
if (ok){
break;
}
}
if(H == copieH){ // Conditie pentru a verifica daca exista modificari
harta(H); // Astfel, daca nu exista modificari, programul se opreste
break;
}
else{
H = copieH;// Altfel, harta salveaza modificarile
}
if (c){ // verifica daca piesa are loc pe harta
harta(H);
c--;
break;
}
if(H != eliminare(H)){ // Daca exista linii complete, acestea se vor elimina
while (H != eliminare(H)){
H = eliminare(H);
liniiComplete ++; // Contorul pentru linii complete creste
}
harta(H);
}
}
scor = sqrt(zerouri(H)) + pow(1.25 , liniiComplete);
printf("GAME OVER!\nScore:%.2lf", scor);
return 0;
}