POJ 1363 (栈的)

来源:互联网 发布:反ps软件叫什么 编辑:程序博客网 时间:2024/06/05 05:40

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++]);}elsereturn 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");elseprintf("No\n");}printf("\n");scanf("%d",&n);}return 0;}