【消除类游戏】注意粗心点:matrix维度不要写错,简单部分也要好好写

小模拟,简单遍历;
进行两次遍历求每行每列可以消除的部分,时间复杂度为O(n^2);
RTE点:vector<vector<int>> matrix(n+1,vector<int>(m+1));别把n,m写错了;

其他:
使用【map】mpROW和mpCOL来存行和列的可以消除的点,并且只存末尾的点和Len,根据尾点和长度还原可消除位置;
另外就是 prev==matrix[i][j]也可能到达结束点,也就是到了矩阵末尾,这里要考虑;
其他就是中途截断,逻辑很好理解;
代码如下:

#include<iostream>
#include<map>
#include<vector>

using namespace std;
struct vertice{
    int x,y;
    bool operator <(const vertice&other)const{
        if(x < other.x){
            return true;
        }
        return y < other.y;
    }
};
map<vertice,int>mpROW;//只记录结尾,ROW
map<vertice,int>mpCOL;//只记录结尾,COL

int main(){
    int n,m;
    cin >> n >>m;
    vector<vector<int>> matrix(n+1,vector<int>(m+1));
    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            cin >> matrix[i][j];
        }
    }
    // for(int i = 0;i < n;i++){
    //     for(int j = 0;j < m;j++){
    //         cout << matrix[i][j]<<" ";
    //     }
    //     cout << endl;
    // }
    int prev = 0;
    int Len = 0;

    //按行遍历
    // cout << "ROW:"<<endl;
    for(int i = 0; i < n;i++){
        for(int j= 0;j < m;j++){
            if(j ==0){
                prev = matrix[i][j];
                Len = 1;
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
            }else if(prev == matrix[i][j]){
                Len++;
                if(j == m-1){
                        if(Len >= 3){
                        // cout << mpROW.size()<<endl;
                        vertice v = {i,j};
                        mpROW.insert({v,Len});//满足,输入
                    }
                }
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
            }else{
                if(Len >= 3){
                    // cout << mpROW.size()<<endl;
                    vertice v = {i,j-1};
                    mpROW.insert({v,Len});//满足,输入
                }
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
                prev = matrix[i][j];
                Len = 1;
            }
        }
    }
    // cout << "COL:"<<endl;
    for(int i = 0; i < m;i++){
        for(int j= 0;j < n;j++){
            if(j == 0){
                prev = matrix[j][i];
                Len = 1;
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
            }else if(prev == matrix[j][i]){
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
                Len++;
                if(j == n-1){
                        if(Len >= 3){
                        vertice v = {j,i};
                        mpCOL.insert({v,Len});
                    }
                }
            }else{
                if(Len >= 3){
                    vertice v = {j-1,i};
                    mpCOL.insert({v,Len});
                }
                // printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
                prev = matrix[j][i];
                Len = 1;
            }
        }
    }

    for(auto e:mpROW){
        vertice v = e.first;
        int Len = e.second;
        int x = v.x;
        int y = v.y;
        // printf("ROW:x = %d,y = %d,len = %d\n",x,y,Len);
        for(int i = 0;i < Len;i++){
            matrix[x][y-i] = 0;
        }
    }

    for(auto e:mpCOL){
        vertice v = e.first;
        int Len = e.second;
        int x = v.x;
        int y = v.y;
        // printf("COL:x = %d,y = %d,len = %d\n",x,y,Len);
        for(int i = 0;i < Len;i++){
            // printf("clear x,y = %d,%d\n",x-i,y);
            matrix[x-i][y] = 0;
        }
    }

    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            cout << matrix[i][j]<<" ";
        }
        cout << endl;
    }
}

里面存在很多劲爆的调试点。。。

posted @ 2025-12-01 20:58  q_z_chen  阅读(2)  评论(0)    收藏  举报