俄罗斯方块( 第07次CCF计算机软件能力认证)

link
方法一:模拟降落过程

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> PII;

int a[20][20], b[10][10];
bool st[20][20];
vector<PII> c, res;
 
signed main(){
    for(int i = 1; i <= 15; ++i){
        for(int j = 1; j <= 10; ++j){
            cin >> a[i][j];
            if(a[i][j]) st[i][j] = 1;
        }
    }
    //一定要加上初始化
    for(int i = 1; i <= 10; ++i) st[16][i] = 1;
    
    int u = 10;
    for(int i = 1; i <= 4; ++i){
        for(int j = 1; j <= 4; ++j){
            cin >> b[i][j];
            if(b[i][j]) {
                u = min(u, i);
                c.push_back({i, j});

            }
        }
    }
    
    int col; cin >> col;
    col--;

    while(1){
        bool flag = false;
        for(auto &x : c){
            if(st[x.first][col+x.second]){
                flag = true;
            }
        }
        if(flag) break;
        res.clear();
        for(auto &x : c){
            res.push_back(x);
            x.first++;
        }
    }
    
    for(auto &x:res){
        // cout << x.first << " " << x.second << endl;
        st[x.first][x.second+col] = 1;
    }
    for(int i = 1; i <= 15; ++i){
        for(int j = 1; j <= 10; ++j){
            cout << st[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

方法二:枚举时刻,被标记两次的格子,答案为前一时刻

#include <bits/stdc++.h>

using namespace std;

//g初始画布,s每一次的新画布
int g[20][20], s[20][20];
int p[5][5];

bool draw(int x, int y){
    memcpy(s, g, sizeof s);
    //将4*4画到新画布
    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 4; ++j){
            if(p[i][j]){
                int a = x + i, b = y + j;
                s[a][b]++;
                if(s[a][b] == 2) return false;
            }
        }
    }
    return true;
}

signed main(){
    for(int i = 0; i < 15; ++i){
        for(int j = 0; j < 10; ++j){
            cin >> g[i][j];
        }
    }
    //补一层,防止一直模拟该运动
    for(int i = 0; i < 10; ++i) g[15][i] = 1;
    
    for(int i = 0; i < 4; ++i)
        for(int j = 0; j < 4; ++j)
            cin >> p[i][j];
            
    int col; cin >> col;
    col--;

    //枚举每个时刻
    for(int i = 0; ; ++i){
        if(!draw(i, col)){
            draw(i-1, col);
            break;
        }
    }
    
    for(int i = 0; i < 15; ++i){
        for(int j = 0; j < 10; ++j){
            cout << s[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}
posted @ 2025-02-27 16:05  awei040519  阅读(10)  评论(0)    收藏  举报