Untitled
unknown
c_cpp
23 days ago
4.2 kB
2
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