游戏模拟OJ,算法题

在这个程序中游戏的区域是一条直线。游戏内有n次投放格子的机会,每次机会程序会给出一个有着随机数R的新格子供投放。

一开始游戏内是空的(无格子),当游戏内无格子的时候,只能把新格子投放到第一个位置(最左边);当游戏内有格子时,只能将新格子投放到某个已存在的格子上(称为被碰撞格子),并且如果被碰撞格子里的数字与新格子的数字相同,那么被碰撞格子里的数字会与新格子的数字合并,被碰撞的格子的数字也变成原来的2倍,这被称为一次合并,如果被碰撞格子里的数字与新格子的数字不同,那么新格子会插入到被碰撞格子的右侧

除了上面的方式能触发合并以外,程序在每次投放后还会从左往右进行一次结算,如果相邻的两个格子的数字相同,那么这两个格子会合并成一个并且合并得到的格子的数字为原本两个格子的数字之和,并且右边的所有格子会向左移动来补齐空位(如果连续n个相同(n>2)先结算前两个),然后重新从左到右结算,这是合并的另一种触发方式

每当合并触发后,如果生成的格子内的数大于2048,那么这个格子会立即消失(消失优先度最高),空位由右边的所有格子向左移动来补齐,这被称为一次完美的合并

得分系统:
1.每当投放一个新数字或者触发一次合并,则得到等于新数字的得分或者等于合并生成的新数的得分两者分开计算,即投入新数字时得到得分(无论是否触发合并),投入后并触发合并再追加获得合并的得分(另外,虽然完美的合并后格子会立即消失,但得分会计入)
⒉.程序会记录达成完美的合并的次数,初始次数为0,每当完成一次完美的合并次数+1
由于得分的显示区域有限,因此得分系统里的得分显示的是总得分对10007取模得到的数字

现在给出投放机会的次数n,以及每次投放的数字R和投放的位置l,请你求出投放次数用完后游戏界面的情况(即格子的情况)以及最后的得分对10007取模得到的结果和达成完美的合并的次数

我的代码

#include 

using namespace std;

int main( )
{
    vector<int> v;
    long long score=0;
    int perf=0;
    int n,j;
    cin>>n;
    for(int i=0;iint e,p;
        cin>>e>>p;
        score+=e;
        if(v.empty()) v.push_back(e);
        else{
            if(v[p-1]==e) {
                v[p-1]*=2;score+=e*2;
                if(v[p-1]>2048)
                {score+=v[p-1];v.erase(v.begin()+p-1);perf++;}
            }
            else v.insert(v.begin()+p,e);
        }
        //此时不会有>2048出现,并且之后只有当发生合并后才会出现>2048(对吗?)
        while(1){
            int flag=0;
            for(j=0;jsize()-1;j++){
                if(v[j]==v[j+1]){
                    v[j]*=2;
                    v.erase(v.begin()+j+1);
                    score+=v[j];
                    if(v[j]>2048) {
                        score+=v[j];
                        v.erase(v.begin()+j);
                        perf++;
                    }
                    flag=1;
                }
            }
            if(flag==1) continue;
            if(flag==0) break;
        }
    }
    for(int i=0;isize();i++) cout<" ";
    cout<<"\n";
    cout<10007<<" "<

只过了两个测试点QAQ求指导

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^