C++ 清除行列

本文介绍了一个简单的矩阵清零算法,该算法通过扫描矩阵并记录含有零元素的行和列,随后将这些行和列的所有元素设为零。文章提供了一个C++实现示例,展示了如何有效地遍历和修改二维数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <vector>
#include<iostream>
using namespace std;
class Clearer {
public:
    vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
        // write code here
        int row_number[n];
        for(int i=0;i<n;i++){
            row_number[i]=0;
        }
        // C++是会给数组进行随机初始化的,故而在这里必须要逐个对于数组中的所有元素进行初始化
        int col_number[n];
        for(int i=0;i<n;i++){
            col_number[i]=0;
        }

        int start=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(mat[i][j]==0){
                    row_number[i]=1;
                    col_number[j]=1;
                }
            }
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(row_number[i]==1 or col_number[j]==1)
                    mat[i][j]=0;
            }
        }
        return mat;
    }
};


int main(){
    vector<vector<int> > vec,output;
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    vector<int> b;
    b.push_back(0);
    b.push_back(1);
    b.push_back(2);

    vector<int> c;
    c.push_back(0);
    c.push_back(0);
    c.push_back(1);

    vec.push_back(a);
    vec.push_back(b);
    vec.push_back(c);

    Clearer clr;
    output=clr.clearZero(vec,3);

    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            cout<<output[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

 

### 蓝桥杯消除游戏的C++实现与解题思路 #### 游戏背景描述 蓝桥杯中的消除类题目通常涉及二维网格操作,玩家通过特定规则移除符合条件的部分元素并重新调整剩余部分的位置。这类问题的核心在于如何高效地检测可被消除的目标以及后续更新整个网格的状态。 --- #### 解题核心逻辑分析 对于此类问题,可以采用分步处理的方式完成任务: 1. **初始化输入数据** 使用二维数组存储初始状态的数据结构。假设矩阵大小为 `m x n`,可以通过标准输入流读取这些值[^2]。 2. **定义消除条件** 根据具体题目设定(如连续三个相同字符或其他模式),编写函数来扫描整个网格以查找满足条件的区域。这一步可能需要多次遍历或者借助辅助队/栈记录待删除位置的信息。 3. **执行实际清除动作** 将找到的所有匹配项标记出来然后真正从原表里去掉它们;注意这里要小心边界情况以免越界访问错误发生。 4. **重力效应模拟掉落过程** 当某些单元格被清空后,“上方”的内容应该向下移动填补空白处——这一阶段往往利用向上的循环迭代逐层下压未受影响之物直至稳定下来为止[^3]。 5. **重复上述步骤直到不再存在新的组合可供消去为止** 以下是基于以上策略的一个简化版伪代码框架展示: ```cpp #include <iostream> #include <vector> using namespace std; // 定义方向偏移量用于搜索相邻元素 const int dx[] = {-1, 0, 1, 0}; const int dy[] = {0, 1, 0, -1}; int m, n; vector<vector<char>> board; bool hasMatch(vector<vector<bool>>& visited){ bool flag = false; // 寻找至少三连相同的图案... for (int i=0;i<m && !flag;++i){ for (int j=0;j<n && !flag;++j){ if (!visited[i][j]){ char c = board[i][j]; vector<pair<int,int>> group; queue<pair<int,int>> q; q.push({i,j}); visited[i][j]=true; group.emplace_back(i,j); while(!q.empty()){ auto [x,y] = q.front(); q.pop(); for(int d=0;d<4&&group.size()<3;++d){ // 只需关注小于等于3的情况 int nx=x+dx[d],ny=y+dy[d]; if(nx>=0 && ny >=0 &&nx<m && ny<n &&!visited[nx][ny] &&board[nx][ny]==c ){ visited[nx][ny]=true; group.emplace_back(nx,ny); q.push({nx,ny}); } } } if(group.size()>=3){ for(auto &[gx,gy]:group){ board[gx][gy]='.';// 或者其他表示为空白的形式 } flag=true; } } } } return flag; } void drop(){ for(int col=0;col<n;++col){ int bottom=m-1; for(int row=m-1;row>=0;--row){ if(board[row][col]!='.'){ swap(board[row][col],board[bottom][col]); --bottom; } } } } int main(){ cin >> m >> n; board.resize(m,vector<char>(n)); for(auto& r:board)for(auto &e:r)cin>>e; while(true){ vector<vector<bool>> visited(m, vector<bool>(n,false)); if(!hasMatch(visited))break; drop(); } for(const auto&r:board){ for(char e:r)cout<<e; cout<<"\n"; } } ``` 此程序片段展示了基本流程,包括但不限于发现目标群集、实施摧毁行动及最后让所有项目自然降落到位等功能模块[^4]。 --- ### 注意事项 - 时间复杂度考量:由于涉及到多轮次全局扫描加上局部修改再反馈至整体布局的过程,因此算法效率至关重要。务必优化内部判定环节减少不必要的计算开销。 - 边缘情形测试:除了正常运行路径之外还应特别留意极端状况比如完全填满无空间亦或是单一行列构成特殊形态等情况下的行为表现是否符合预期。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值