2019网易校招(1星) 俄罗斯方块

这篇博客介绍了如何解决一个特殊的俄罗斯方块得分问题,其中每行被填满时得1分。作者提出了一个思路,即统计每个列出现的次数,找到最少的填充列数作为得分。文章包含两次代码实现,第一次尝试使用vector统计,第二次修正了终止条件。作者还分享了关于C++中vector作为函数参数的使用方法和注意事项。
摘要由CSDN通过智能技术生成

题目描述

小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块。因为它比较古老,所以规则和一般的俄罗斯方块不同。
荧幕上一共有 n 列,每次都会有一个 1 x 1 的方块随机落下,在同一列中,后落下的方块会叠在先前的方块之上,当一整行方块都被占满时,这一行会被消去,并得到1分。
有一天,小易又开了一局游戏,当玩到第 m 个方块落下时他觉得太无聊就关掉了,小易希望你告诉他这局游戏他获得的分数。
输入描述:
第一行两个数 n, m
第二行 m 个数,c1, c2, … , cm , ci 表示第 i 个方块落在第几列
其中 1 <= n, m <= 1000, 1 <= ci <= n
输出描述:
小易这局游戏获得的分数

示例1
输入
3 9
1 1 2 2 2 3 1 2 3

输出
2

思考

  1. 第二行输入怎么表示?
    用map吗? 思考后还是用 vector 输入

  2. 如何表示得分(如何表示占满一行) ?
    个人思考:
    统计第二行输入中,1,2, 3到 m 的个数,最小的就是所求得分。
    不足:时间复杂度高

代码实现

初次实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n,m,score,c;
    cin >>n >> m;
    
    vector <int> C;
    for(int i=0;i<m;i++)
    {
        cin >> c;
        C.push_back(c);
    }
    
    int num1,num2,num3;
    num1 = count(C.begin(),C.end(),1);
    num2 = count(C.begin(),C.end(),2);
    num3 = count(C.begin(),C.end(),3);
    
    score = min(min(num1,num2),num3);
    return 0;
}
   int num1,num2,num3;
    num1 = count(C.begin(),C.end(),1);
    num2 = count(C.begin(),C.end(),2);
    num3 = count(C.begin(),C.end(),3);
    
    score = min(min(num1,num2),num3);

代码错误。 m个方块,不能从num1,num2, 统计到numm。

第二次实现

#include <iostream>
#include <vector>

int minv(vector <int> v) 
{
    int min;
    min = v[0];
    for(int i=0;i<v.size();i++)
    {
        if(v[i]<min)
        min = v[i];
    }
    return min;
}

int main()
{
    /* 输入n,m*/
    int n, m,c;   /* n 表示列,m表示块数,c 表示落下块的位置*/
    cin >> n >> m;

    /* 输入落下的块*/
    vector <int> v(n,0);  /* n列 */
    for (int i=0;i<v.size();i++)
    {
        cin >> c;
        v[c - 1]++;
    }

    /* 找出最小的vector的元素值*/
    cout << minv(v);
    return 0;
}

问题:
主函数里 for (int i=0;i<v.size();i++) 终止条件是 i < m;

#include <iostream>
#include <vector>
using namespace std;

int minv(vector <int> v)
{
    int min;
    min = v[0];
    for(int i = 0; i < v.size(); i++)
    {
        if (v[i] < min)
            min = v[i];
    }
    return min;
}

int main()
{
    /* 输入n,m*/
    int n, m,c;   /* n 表示列,m表示块数,c 表示落下块的位置*/
    cin >> n >> m;
    /* 输入落下的块*/
    vector <int> v(n,0);  /* n列 */
    for (int i=0;i<m;i++)
    {
        cin >> c;
        v[c - 1]++;
    }
    /* 找出最小的vector的元素值*/
    cout << minv(v);
    return 0;
}

收获

1. vector 作为函数参数怎么使用?

function1(std::vector< int > vec),传值
function2(std::vector< int >& vec),传引用
function3(std::vector< int >* vec),传指针
注意,三种方式分别有对应的const形式,不在此讨论。

三种方式对应的调用形式分别为:

function1(vec),传入值
function2(vec),传入引用
function3(&vec),传入地址

2、vector 作为函数参数怎么使用
vector 作为函数参数怎么用

3、vector 元素使用
vector[索引];例如: v[0]; 索引为0的值

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值