103번 문자 인식 문제에서요

  • User Avatar
    OneShot

    문제에는 잘못된 값이 들어올 수 없다고 되어있는데요.. 맞나요??
    아무리 해도 WA가 뜨네요..ㅜ_ㅜ
    다른 분들이 WA에 대해서 많이 건의하신거 같은데요.. 해당 문제에 대한 예시 input과 output을 좀더 늘려주시거나
    많이 해서 txt 파일로 올려주시면 많은 도움이 될 것 같은데요 ㅎㅎ (문제 푸는 의미가 없어지려나;;)
    아무튼 질문입니다. 알고리즘은 잘 몰라서;; 그냥 직관적으로 문제를 풀어가고 있는데요
    자체적으로 샘플 만들어서 돌릴때는 문제가 없는데 자꾸 WA가 뜨네요.. 소스 첨부합니다.
    ps:del_char 부분은 대충 만들어서 시간이 오래걸리는데 나중에 수정할 거에요 ㅎ





     #include <stdio.h>
    #include <windows.h>
    #define UP 0x1
    #define RIGHT 0x2
    #define DOWN 0x4
    #define LEFT 0x8
    #define NONE 0
    char board[26][82];
    int row, col;
    int down_check(int &, int &);
    int right_check(int &, int &);
    void del_char(int, int);
    int main(){
     int test_num;
     int num_of_edge;
      scanf("%d", &test_num);
     for (int i=0 ; i<test_num ; i++){
      int result=0;
      int tmp_row, tmp_col;
      scanf("%d %d", &row, &col);
      // 초기화
      for (int j=1 ; j<=row ; j++){
       for (int k=1 ; k<=col ; k++){
        scanf(" %c", &board[j][k]);
       }
       board[j][col+1]='';
      }
      for (int j=0 ; j<=col ; j++){
       board[row+1][j]='';
      }
      // 계산 부분
      
      for (int j=1 ; j<=row ; j++){
       for (int k=1 ; k<=col ; k++){
        if (board[j][k] == '*'){   // 문자 발견시
         // 0, 5, 6, 8, 9 인 경우
         if (board[j+1][k] == '*' && board[j][k+1] == '*'){
          tmp_row=j, tmp_col=k;
          while(board[j][k+1] == '*'){
           board[j][k+1] = '_';
           k++;
          }
          num_of_edge=down_check(tmp_row, tmp_col);

          if (num_of_edge == RIGHT){ // 5, 9, 0 인 경우
           num_of_edge=right_check(tmp_row, tmp_col);
           if (num_of_edge == UP)  // 0 이다
            result+=0;
           else if (num_of_edge == DOWN) // 5이다
            result+=5;
           else       // 9이다
            result+=9;
          }
          else{       // 6, 8인 경우
           num_of_edge=right_check(tmp_row, tmp_col);
           if (num_of_edge == DOWN)  // 6이다
            result+=6;
           else       // 8이다
            result+=8;
          }
          del_char(tmp_row, tmp_col);
         }
         // 2, 3, 7인 경우
         else if (board[j][k+1] == '*'){
          while(board[j][k+1] == '*'){
           board[j][k] = '_';
           k++;
          }
          tmp_row=j, tmp_col=k;


          num_of_edge = down_check(tmp_row, tmp_col);
          if (num_of_edge == NONE)  // 7이다
           result+=7;
          else if (num_of_edge == LEFT) // 2이다.
           result+=2;
          else      // 3이다.
           result+=3;
          del_char(tmp_row, tmp_col);
         }
         // 1, 4 인 경우
         else{
          tmp_row=j, tmp_col=k;
          num_of_edge=down_check(tmp_row, tmp_col);
          if (num_of_edge == NONE)
           result+=1;
          else
           result+=4;
          del_char(tmp_row, tmp_col);
         }
        }  // end if
       }  //end for k
      }  //end for j
      printf("%dn", result);
     }
     return 0;
    }
    int down_check(int &i, int &j){
     int result=NONE;
     while(board[i+1][j]=='*'){
      board[i][j]='_';
      i++;
      if(board[i][j+1]=='*' || board[i][j-1]=='*')
       break;
     }
     
     if (board[i+1][j]=='*'){   // 아래에 문자가 있으면
      result+=DOWN;
     }
     if (board[i][j+1]=='*'){  // 오른쪽에 문자가 있으면
      result+=RIGHT;
     }
     else if(board[i][j-1]=='*')        // 왼쪽에 문자가 있으면
      result+=LEFT;
     return result;
    }
    int right_check(int &i, int &j){
     int result=NONE;
     do{
      board[i][j]='_';
      j++;
     }while (board[i+1][j]=='_' && board[i-1][j]=='_');
     if (board[i+1][j]=='*'){  // 아래에 문자가 있으면
      result+=DOWN;
     }
     if (board[i-1][j]=='*')       // 위에 문자가 있으면
      result+=UP;
     return result;
    }
    void del_char(int i, int j){
     board[i][j]='_';
     if (board[i-1][j]=='*'){  // 위에 문자가 있을때
      del_char(i-1, j);
     }
     if (board[i][j+1]=='*'){  // 오른쪽에 문자가 있을때
      del_char(i, j+1);
     }
     if (board[i][j-1]=='*'){  // 왼쪽에 문자가 있을때
      del_char(i, j-1);
     }
     if (board[i+1][j]=='*'){  // 아래에 문자가 있을때
      del_char(i+1, j);
     }
    }

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]


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