Untitled
unknown
c_cpp
7 months ago
4.2 kB
3
Indexable
char** buf=(char**)malloc(sizeof(char*)*(row+1)+sizeof(char)*(row+1)*(col+1));
ptr=buf+row+1;
for (int i=1; i<=row; i++) {
buf[i]=(char*)ptr+i*(col+1);
}
static function<void(char, int)> solid_block=[&](char label, int r) {
for (int i=r; i>r-3&&i>=1; i--) {
for (int j=1; j<=col; ++j) {
if (grid[i][j]==label) ngrid[i][j]='#';
}
}
};
static function<void(char, int)> move_block=[&](char label, int r) {
for (int i=r; i>r-3&&i>=1; i--) {
for (int j=1; j<=col; ++j) {
if (grid[i][j]==label) {
ngrid[i+1][j]=label;
grid[i][j]='.';
}
}
}
};
static function<bool(char, int)> check_block=[&](char label, int r) {
if (r==row) return false;
for (int i=r; i>r-3&&i>=1; i--) {
for (int j=1; j<=col; ++j) {
if (grid[i][j]==label&&ngrid[i+1][j]!='.') return false;
}
}
return true;
};
for (; gameTimer<=p; gameTimer++) {
// re init ngrid
for (int i=1; i<=row; i++) {
for (int j=1; j<=col; j++)
ngrid[i][j]='.';
}
for (int i=row; i>1; --i) {
for (int j=1; j<=col; ++j) {
if (grid[i][j]!='.'&&grid[i][j]!='#'&&ngrid[i][j]=='.') {
if (check_block(grid[i][j], i)) {
move_block(grid[i][j], i);
} else {
solid_block(grid[i][j], i);
}
} else if (grid[i][j]=='#') ngrid[i][j]='#';
}
}
for (int i=1; i<=row; i++) {
for (int j=1; j<=col; j++) {
grid[i][j]=ngrid[i][j];
ngrid[i][j]='.';
}
}
// buffer prepared for now grid, and next simulation
for (int i=1; i<=row; i++) {
for (int j=1; j<=col; j++)
buf[i][j]=grid[i][j];
}
// recalculte the solid block
for (int i=row; i>1; i--) {
for (int j=1; j<=col; j++) {
char block=grid[i][j];
if (block!='.'&&block!='#'&&ngrid[i][j]=='.') {
if (check_block(grid[i][j], i)) {
move_block(grid[i][j], i);
} else {
solid_block(grid[i][j], i);
}
} else if (grid[i][j]=='#') ngrid[i][j]='#';
}
}
for (int i=1; i<=row; i++) {
for (int j=1; j<=col; j++) {
if (ngrid[i][j]=='#') grid[i][j]=ngrid[i][j];
else grid[i][j]=buf[i][j];
}
}
// eliminate row
int step=0;
for (int i=row; i>=1; --i) {
if (checkRow(row)) {
eliminate(row);
step++;
} else {
break;
}
}
for (int i=row; step!=0&&(i-step>0); --i) {
memcpy(grid[i], grid[i-step], sizeof(char)*(col+1));
for (int j=1; j<=col; ++j) grid[i-step][j]='.';
}
}
free(ngrid);
free(buf);
// cout<<"Time: "<<gameTimer<<endl;
// print(); cout<<endl;
return;
}
void Scene::addBlock(int x, int y, char** block) {
static char label=1;
label=label%CHAR_MAX;
while (label=='*'||label=='#'||label=='.'||label<=0) label++;
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
if (block[i][j]=='*') {
grid[x+i][y+j]=label;
}
}
}
label++;
}
bool Scene::checkRow(int r) const {
for (int i=1; i<=col; ++i) {
if (grid[r][i]=='.') return false;
}
return true;
}
void Scene::eliminate(int r) {
for (int i=1; i<=col; ++i) grid[r][i]='.';
}
void Scene::print() const {
for (int i=1; i<=row; i++) {
for (int j=1; j<=col; j++) {
if (grid[i][j]=='#'||grid[i][j]=='.') cout<<grid[i][j];
else cout<<'*';
}
cout<<endl;
}
}
int main() {
int n, m, t, k;
cin>>n>>m>>t;
Scene scene(n, m);
cin>>k;
char** block=(char**)malloc(sizeof(char*)*3);
for (int i=0; i<3; i++)
block[i]=(char*)malloc(sizeof(char)*3);
while (k--) {
int p, x, y;
cin>>p>>x>>y;
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++)
cin>>block[i][j];
}
if (p>t) continue;;
scene.update(p);
scene.addBlock(x, y, block);
}
scene.update(t);
scene.print();
return 0;
}
Editor is loading...
Leave a Comment