이번 라운드 B번 윷놀이 풀다가 멘붕 일으켰습니다 ㅠ..ㅠ

  • Chaos.PP
    Chaos.PP

    이 문제 풀다가 계속 오답이 나와서 멘붕 일으켰습니다 ㅜ..ㅜ

    누가 좀 왜 틀렸는지 알려주세용 훌..

    아래 코드는 문제에 나와있는대로 시뮬레이션 돌리고 결과 비교한 것입니다.

    #include <stdio.h>
    #include <map>
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    vector < vector< int > > G;
    map<string, int> TABLE;
    map<int, int> path;
    
    void init() 
    {
      TABLE["Do"] = 1;
      TABLE["Gae"] = 2;
      TABLE["Gul"] = 3;
      TABLE["Yut"] = 4;
      TABLE["Mo"] = 5;
    
      G.resize(30);
      for (int i=0; i<19; i++)
        G[i].push_back(i+1);
    
      for (int i=20; i<24; i++)
        G[i].push_back(i+1);
    
      for (int i=25; i<28; i++)
        G[i].push_back(i+1);
    
      G[0].push_back(29);
      G[5].push_back(20);
      G[10].push_back(25);
      G[22].push_back(27);
      G[24].push_back(15);
    
      G[28].push_back(0);
      G[19].push_back(0);
    
      path[5] = -1;
      path[10] = -1;
      path[22] = -1;
    }
    
    
    int main()
    {
      FILE *fp = fopen("B-small-attempt1.in", "r");
      FILE *fout = fopen("output.txt", "w");
    
      init();
    
      int T;
      fscanf(fp, "%d", &T);
      for (int w=0; w<T; w++) {
        int U, N, A, B;
    
        fscanf(fp, "%d %d %d %d", &U, &N, &A, &B);
    
        int turn = 0;
        bool state[2] = {false, false};
        int cur[2] = {29, 29};
        for (int i=0; i<N; i++) {
          char temp[10];
    
          fscanf(fp, "%s", temp);
          int res = TABLE[temp];
    
          if (cur[turn] == 29)
            cur[turn] = 0;
    
          if (cur[turn] == 0 && state[turn] == true) {
            //game end
            cur[turn] = 29;
            break;
          }
    
          state[turn] = true;
          if (path.find(cur[turn]) != path.end()) {
            cur[turn] = G[cur[turn]][1];
            res--;
          }
          else {
            cur[turn] = G[cur[turn]][0];
            res--;
          }
    
          for (int k=1; k<=res; k++) {
            if (cur[turn] == 0 && state[turn] == true) {
              //game end
              cur[turn] = 29;
              break;
            }
    
            cur[turn] = G[cur[turn]][0];
          }
    
          if (cur[turn] == 29)
            break;
    
    
          if (cur[0] == cur[1]) {
            if (turn == 0) {
              cur[1] = 29;
              state[1] = false;
            }
            else {
              cur[0] = 29;
              state[0] = false;
            }
          }
          else if (strcmp(temp, "Yut") == 0 || strcmp(temp, "Mo") == 0) {
    
          }
          else {
            if (turn == 0) turn = 1; else turn = 0;
          }
    
        }
        char temp[1000];
        fgets(temp, 1000, fp);
    
        int last[2];
        if (A == 0)
          last[0] = 29;
        else
          fscanf(fp, "%d", &last[0]);
    
        if (B == 0)
          last[1] = 29;
        else
          fscanf(fp, "%d", &last[1]);
    
        if (temp[0] != '\n') {
          fprintf(fout, "Case #%d: NO\n", w+1);
          continue;
        }
    
        if (cur[0] == last[0] && cur[1] == last[1])
          fprintf(fout, "Case #%d: YES\n", w+1);
        else
          fprintf(fout, "Case #%d: NO\n", w+1);
      }
    
    
      return 0;
    }
    

    12년 전
4개의 댓글이 있습니다.
  • Pekaz
    Pekaz

    저도 멘붕 .. 아 .. 그거때문에 시간 다 잡아먹고 C번 읽고 풀던 도중에 대회가 끝나버렸으여 ㅠㅠ...
    저도 제 코드를 더 읽고 생각해보고 싶기 때문에 님 코드는 안읽지 않았습니다 > <ㅋ


    12년 전 link
  • hyunhwan
    hyunhwan

    그나저나 markdown 문법에 맞게 글을 작성하셨는데, 구문 강조 기능이 깨지는 것처럼 보이네요. 이상합니다.


    12년 전 link
  • Being
    Being

    code lang = 'c++' 이라 된 것을 code lang="c++" 으로 고쳤습니다. 표준 XML에 가깝게 씁시다. :)


    12년 전 link
  • hyunhwan
    hyunhwan

    대회 끝나고 저도 한번 구현해봤는데 저랑 비슷한 곳에서 틀리신거 같습니다.

    아마 문제에서 22번 좌표에 대한 처리가 문제인거 같은데요, 저의 경우에 막혔던 데이터는 다음과 같습니다.

    1
    1 16 1 0
    Gae Do Yut Gae Do Gae Gul Do Do Do Do Do Do Do Gae Gul
    2
    
    

    답이 YES가 나와야 하는데, Chaos.PP 님의 것에서는 NO가 나오는 것으로 확인됩니다.


    12년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.