外层queue统计水果分块,内层queue记录水果块内水果编号。简单的模拟就行。
#include <bits/stdc++.h>
using namespace std;
struct Node{
queue<int> q;
int t;
};
queue<Node *> qq;
int n,k,tmp;
int main()
{
int x,y;
Node *pn;
//先压入第一个水果
cin>>n;
cin>>x; y=x;
pn = new Node;
pn->t = x;
pn->q.push(1);
//压入后续n-1个水果
for(int i=2;i<=n;i++){
cin>>x;
//如果和上个水果不同,就新开一个node
if(pn->t != x){
qq.push(pn);
pn=new Node;
pn->t = x;
}
pn->q.push(i);
}
//最后一个压入
qq.push(pn);
//压入一个结束标记,用来控制一轮水果选择结束
pn = new Node;
pn->t = 3; //不是0,也不是1就可以
pn->q.push(0); //只是为了后续循环判断统一
qq.push(pn);
//输出
y=4; //初始一个和所有水果不同的编号
while(qq.size()>1){
pn = qq.front();
qq.pop();
//如果和上次选的水果不同
if(pn->t != y){
//如果是一轮结束标记,打印换行,更新y
if(pn->t == 3){
cout<<endl;
y=4;
}
else{ //否则输出水果编号
cout<<pn->q.front()<<" ";
pn->q.pop();
y=pn->t;
}
}
//还有水果就继续入队列
if(pn->q.size()){
qq.push(pn);
}
else{ //否则删除
delete pn;
}
}
return 0;
}