假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。
#include
using namespace std;
typedef struct queue1
{
int *data;
}lqueue,*queue;
typedef struct pt
{
int front = 0;
int rear = 0;
}pt1,*Q1;
typedef struct stack1
{
int *data;
int top;
}lstack,*stack;
queue create(queue h,int n,int k)
{
queue p;
p = h;
p->data = new int[n*k];
return p;
}
stack create1(stack h,int m)
{
stack p;
p = h;
p->data = new int[m];
p->top = -1;
return p;
}
int main()
{
lqueue qe;
queue q;
q = &qe;
int n,m,k;
cin>>n>>m>>k;
q = create(q,n,k);
pt1 ptaa;
Q1 Q;
Q = &ptaa;
for(int i = 1;i <= n*k;i++)
{
int x;
cin>>x;
q->data[Q->rear++] = x;
}
lstack st;
stack s;
s = &st;
s = create1(s,m);
int i = 1,mask = 1,f = 0;
for(;i <= k;i++)
{
Q->front = (i-1)*n;
mask = 1;
s->top = -1;
while(Q->front < i*n)
{
if(q->data[Q->front] == mask)
{
mask++;
if(s->top == -1)
{
Q->front++;
}
else
{
if(mask == s->data[s->top])
{
s->top--;
Q->front++;
}
else
{
int t;
t = s->top;
s->top--;
while(s->top != -1)
{
if(s->data[s->top] == mask)
{
cout<<"NO"<1;
break;
}
else
s->top--;
}
s->top = t;
Q->front++;
}
}
}
else
{
s->data[++s->top] = q->data[Q->front++];
if(s->top == m)
{
cout<<"NO"<1;
break;
}
}
if(f == 1)
{
break;
}
}
if(f == 1)
{
f = 0;
continue;
}
cout<<"YES"<