103번 문자 인식 문제에서요

  • OneShot
    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);  } }
    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

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