poj 1363
我花了半天的时间解决这一题,也不差一点时间写注释;
我的思路:
一:A边的车厢,先和B边的比,成了就A,和B出站;
二: 如果(一)不成立;则station和b比,成,就A,station 出站;
三:如果一,二,不成立,就将A的车厢压到station栈中;
四,重复一,二,三,结束条件是A没有车厢 并且 station没车厢 或者 b出栈出完了;
在这里说说我的失误,为什么这么长时间,才解决这个水题;
一;我AB都用栈来存,搞大了流程复杂度;
二;每一步尽量用函数解决,分块解决,减少流程的复杂度;
/*
poj 1363
我花了半天的时间解决这一题,也不差一点时间写注释;
我的思路:
一:A边的车厢,先和B边的比,成了就A,和B出站;
二: 如果(一)不成立;则station和b比,成,就A,station 出站;
三:如果一,二,不成立,就将A的车厢压到station栈中;
四,重复一,二,三,结束条件是A没有车厢 并且 station没车厢 或者 b出栈出完了;
在这里说说我的失误,为什么这么长时间,才解决这个水题;
一;我AB都用栈来存,搞大了流程复杂度;
二;每一步尽量用函数解决,分块解决,减少流程的复杂度;
*/
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;
const int MAX = 1001;
int a[MAX];
int b[MAX];
stack <int>sta;
int n;
void showA()
{
int i;
printf("a[] = ");
for(i=0; i<n; i++)
{
printf(" %d",a[i]);
}
printf("\n");
}
void showB()
{
int i;
printf("b[] = ");
for(i=0; i<n; i++)
{
printf(" %d",b[i]);
}
printf("\n");
}
bool initB()
{
int i,temp;
for(i=0; i<n+1; i++) b[i] = 0;
for(i=0; i<n; i++)
{
scanf(" %d",&temp);
b[i] = temp;
if(i==0 && temp==0) return false;
}
return true;
}
void initA()
{
int i;
for(i=0; i<n+1; i++) a[i] = 0;
for(i=0; i<n; i++)
{
a[i] = i+1;
}
}
bool solve()
{
int i=0,j=0,k;
while(sta.size()) sta.pop(); //初始化sta;
while(j<n) //这里就是我上面说了流程
{
if(a[i] == b[j])
i++,j++;
else if(sta.size() != 0 && sta.top()==b[j])
{
sta.pop();
j++;
}
else if(i<n)
{
sta.push(a[i++]);
}
else
return false;
}
if(j==n) return true;
return false;
}
int main()
{
bool nMark;
scanf("%d",&n);
while(n)
{
initA(); //初始化A边
while(initB()) //初始化B边, 有可能第一个元素是0,这里做了一个判断;
{
if( solve() ) //solve() 关键是解决能否完美出车;
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
scanf("%d",&n);
}
return 0;
}