예제 6 - 2 UVA 514 - Rails (레일)

1722 단어 C 언어uva
좋 은 제목 입 니 다. 샘플 코드 를 생각 하 며 오랫동안 생각 했 습 니 다.
대체적인 사고방식:
전체적으로 두 가지 과정 으로 나 뉘 는데 A 에서 C 까지 C 에서 B 까지
A 대표 로 A 에서 C 까지 의 번호 서열 은 1 에서 n 이 분명 하 다.
B 대표 로 최종 B 에 있 는 차 번호.
A = 1, B = 1, B 를 최종 차량 의 배열 색인 으로 합 니 다.
순환 을 시 작 했 는데 A 중의 차 가 B 중의 차 와 같다 는 것 을 발견 하면 이 차 는 즉시 역 에 들 어가 서 바로 역 을 나 가 야 한 다 는 것 을 설명 했다.
else  B 중의 차 가 창고 C 중의 첫 번 째 와 같다 는 것 을 발견 하면 이때 창고 C 의 차 가 역 을 나 가 야 한 다 는 것 을 설명 한다.
else 는 A 중 에 남 은 것 을 발견 하면 A 를 역 에 들 어가 게 한다.
그렇지 않 으 면 무의미 하 다. 그럼 노!
출력 주의 형식 만 있 으 면 OK 입 니 다. 저 는 한 번 에 문 제 를 잘 읽 지 못 했 습 니 다. 형식 에 잘못 되 었 습 니 다. 사실은 마지막 그룹 뒤에 빈 줄 이 있 습 니 다!
시사 점:
이 문 제 는 이렇게 생각 하지 않 으 면 억지로 생각 하 는 것 입 니 다. 번 거 롭 고 어 쩔 줄 모 르 기 때문에 이 문 제 는 저 에 게 시사 점 을 주 었 습 니 다. 그것 은 문 제 를 최대한 현실 화하 고 구체화 시 키 는 것 입 니 다. 바로 이 문 제 를 실제 적 인 의미 로 만 드 는 것 입 니 다. 하나의 시 뮬 레이 션 입 니 다. 마지막 else 는 성립 되 지 않 을 것 입 니 다!
코드 는 다음 과 같 습 니 다:
#include<stack>
#include<cstdio>
using namespace std;
const int maxn = 1000 + 10;
int a[maxn];
int main()
{
    int n,cnt=0;
    while(scanf("%d",&n) == 1 && n){
        while(scanf("%d",&a[1]) && a[1]){
            for (int i = 2; i <= n; ++i)scanf("%d",&a[i]);
            stack<int>s;
            int A=1,B=1;
            bool ok=true;
            while(B <= n){
                if (A == a[B]){A++;B++;}
                else if (!s.empty() && s.top() == a[B]){s.pop();B++;}
                else if(A <= n)s.push(A++);
                else {ok=false;break;}
            }
            printf("%s", ok ? "Yes
" : "No
"); } printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기