Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- #define pii pair<int, int>
- #define r first
- #define c second
- /// R D
- pii ctrl[2] = {{0, 1}, {1, 0}};
- vector<vector<char>> board;
- int row, col, q, score;
- void PrintBoard(){
- for(int i = 1; i <= row; ++i){
- for(int j = 1; j <= col; ++j){
- cout << board[i][j] << " ";
- }
- cout << "\n";
- }
- return;
- }
- void FalltoBelow(pii s){
- if(board[s.r][s.c] != '-'){
- return;
- }
- int r = s.r - 1;
- int c = s.c;
- while(r > 0 && board[r][c] != '#' && board[r][c] != '-'){
- swap(board[r][c], board[r + 1][c]);
- --r;
- }
- return;
- }
- pii FallfromAbove(pii s){
- if(board[s.r][s.c] == '-' || board[s.r][s.c] == '#'){
- return s;
- }
- int r = s.r + 1;
- int c = s.c;
- while(r <= row && board[r][c] == '-'){
- swap(board[r][c], board[r - 1][c]);
- ++r;
- }
- return {r - 1, c};
- }
- void BFS(pii s){
- vector<pii> fall;
- queue<pii> q;
- fall.push_back(s);
- q.push(s);
- char t = board[s.r][s.c];
- board[s.r][s.c] = '-';
- score += 5;
- while(!q.empty()){
- int r = q.front().r;
- int c = q.front().c;
- q.pop();
- for(int i = 0; i < 2; ++i){
- int nr = r + ctrl[i].r;
- int nc = c + ctrl[i].c;
- if(nr <= row && nc <= col && board[nr][nc] == t){
- q.push({nr, nc});
- fall.push_back({nr, nc});
- board[nr][nc] = '-';
- score += 5;
- }
- }
- }
- for(auto x : fall){
- FalltoBelow(x);
- }
- return;
- }
- int main(){
- int r, c;
- char cmd;
- /// Get board
- scanf("%d %d", &row, &col);
- board.assign(row + 2, vector<char>(col + 2, '\0'));
- for(int i = 1; i <= row; ++i){
- for(int j = 1; j <= col; ++j){
- scanf(" %c", &cmd);
- board[i][j] = cmd;
- }
- }
- scanf("%d", &q);
- score = 0;
- for(int i = 0; i < q; ++i){
- scanf("%d %d %c", &r, &c, &cmd);
- ++r;
- ++c;
- /// Move L or R
- pii start = {r, c};
- pii target;
- switch(cmd){
- case 'L':
- target = {r, c - 1};
- break;
- case 'R':
- target = {r, c + 1};
- break;
- }
- /// Invalid moves
- if(target.c < 0 || target.c >= col || board[r][c] == '-' || board[r][c] == '#' || board[r][target.c] != '-'){
- score -= 5;
- continue;
- }
- /// Fall
- board[target.r][target.c] = board[start.r][start.c];
- board[start.r][start.c] = '-';
- target = FallfromAbove(target);
- FalltoBelow(start);
- /// Check blocks to destroy
- bool change = true;
- while(change){
- change = false;
- for(int j = 1; j <= row; ++j){
- for(int k = 1; k <= col; ++k){
- for(int a = 0; a < 2; ++a){ /// Check R and D
- int cr = j + ctrl[a].r;
- int cc = k + ctrl[a].c;
- if(board[j][k] != '-' && board[j][k] != '#' && cr <= row && cc <= col && board[j][k] == board[cr][cc]){
- change = true;
- BFS({j, k});
- }
- }
- }
- }
- }
- }
- cout << score << "\n";
- PrintBoard();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement