Untitled

 avatar
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