블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

Algorithm Traning Book - 다섯번째 문제

Algorithm 2008/06/15 23:13 귀차니스트
  음 한 주가 지나가고 새로운 한 주가 시작되는 시점입니다. 뭐 이런저런 일들이 저번 주에는 많았군요. 어떻게 하다보니 필요에 의한 근무지를 경산으로 잠시 옮기게 되었습니다. 기간은 약 1달 정도로 잡고 있구요. 미완된 프로그램을 완전하게 작성하는 부분이 남았습니다. 야근이 계속 된다면 포스팅이 더뎌 질 수도 있겠군요^^.

  이번 문제도 쉬운 문제입니다. 이름은 Graphical Editor이구요. 입력되는 명령을 파싱하여 구분별로 입력받은 좌표와 데이터로 간단한 데이터 조작하는 것이 문제 해결의 전부입니다. 어떻게 입력을 받고 출력을 해야 하는지 한 번 살펴보도록 하겠습니다.

입력( 제한 X와 Y 좌표는 1 <= X,Y <= 250 까지만 입력됩니다. )
I 5 6
L 2 3 A
S one.bmp
G 2 3 J
F 3 3 J
V 2 3 4 W
H 3 4 2 Z
S two.bmp
X

출력
one.bmp
OOOOO
OOOOO
OAOOO
OOOOO
OOOOO
OOOOO
two.bmp
JJJJJ
JJZZJ
JWJJJ
JWJJJ
JJJJJ
JJJJJ

  대충 이런 출력형식을 띄게 됩니다. 물론 입력값에 대한 정의는 아래와 같죠.

I M N - 모든 픽셀이 M X N 이미지 크기로 됩니다. 데이터는 O로 채워집니다.
C      - 모든 픽셀을 O로 채워 지웁니다.

L X Y C - (X, Y) 픽셀을 C색으로 채웁니다.
V X Y1 Y2 C - X열에 해당하는 Y1에서 Y2까지 C색으로 세로선을 그립니다.
H X1 X2 Y C - Y행에 해당하는 X1에서 X2까지 C색으로 가로선을 그립니다.
K X1 Y1 X2 Y2 C - (X1,Y1)에서 (X2, Y2) 까지 사각형을 C색으로 칠합니다.
F X Y C - (X, Y)에 해당하는 픽셀에 인접하는 같은 색의 모든 픽셀을 C색으로 칠합니다.
S Name - 파일 이름을 출력합니다.
X - 프로그램을 종료합니다.

  정의는 그렇게 어렵지 않죠^^. 그래도 나름 한 가지 생각해볼 것이라면 F 커맨드가 이 중엔 제일 이겠군요. 그래도 별로 어렵지는 않으니 ^^. 재미있게 대충대충 ㅎㅎ

Graphical.cpp (Language : cpp)
  1. #include <iostream>
  2. #include <string>
  3. #include <deque>
  4.  
  5. int Width, Height;
  6. char Image[251][251];
  7.  
  8. void StringTokenizer( const std::string &Str, std::deque< std::string > &Token, const std::string &Delimiter );
  9.  
  10. void NewImage( std::deque< std::string > &Token );
  11. void ClearImage( std::deque< std::string > &Token );
  12. void SetPixel( std::deque< std::string > &Token );
  13. void VerticalLine( std::deque< std::string > &Token );
  14. void HorizonLine( std::deque< std::string > &Token );
  15. void Square( std::deque< std::string > &Token );
  16. void MagicWord( std::deque< std::string > &Token );
  17. void SaveImage( std::deque< std::string > &Token );
  18. void ExitProgram( std::deque< std::string > &Token );
  19.  
  20. void NearstFill( int X, int Y, char Color, char OldColor );
  21.  
  22. int main( int argc, char **argv )
  23. {
  24.     char InputString[ 256 ];
  25.  
  26.     while( true )   {
  27.  
  28.         std::cin.getline( InputString, 255 );
  29.         std::deque< std::string > TokenContainer;
  30.  
  31.         StringTokenizer( InputString, TokenContainer, "\t " );
  32.  
  33.         std::string &Cmd = TokenContainer.front();
  34.         if( Cmd == "I" )
  35.             NewImage( TokenContainer );
  36.         else if( Cmd == "C" )
  37.             ClearImage( TokenContainer );
  38.         else if( Cmd == "L" )
  39.             SetPixel( TokenContainer );
  40.         else if( Cmd == "V" )
  41.             VerticalLine( TokenContainer );
  42.         else if( Cmd == "H" )
  43.             HorizonLine( TokenContainer );
  44.         else if( Cmd == "K" )
  45.             Square( TokenContainer );
  46.         else if( Cmd == "F" )
  47.             MagicWord( TokenContainer );
  48.         else if( Cmd == "S" )
  49.             SaveImage( TokenContainer );
  50.         else if( Cmd == "X" )
  51.             ExitProgram( TokenContainer );
  52.     }
  53.  
  54.     return 0;
  55. }
  56.  
  57. void StringTokenizer( const std::string &Str, std::deque< std::string > &Token, const std::string &Delimiter )
  58. {
  59.     std::string::size_type LastPos = Str.find_first_not_of( Delimiter, 0 );
  60.     std::string::size_type Pos     = Str.find_first_of( Delimiter, LastPos );
  61.    
  62.     while( std::string::npos != Pos || std::string::npos != LastPos )
  63.     {
  64.         Token.push_back( Str.substr( LastPos, Pos - LastPos ) );
  65.         LastPos = Str.find_first_not_of( Delimiter, Pos );
  66.         Pos = Str.find_first_of( Delimiter, LastPos );
  67.     }
  68. }
  69.  
  70. void NewImage( std::deque< std::string > &Token )
  71. {
  72.     Width = atoi(Token[1].c_str());
  73.     Height = atoi(Token[2].c_str());
  74.  
  75.     ClearImage( Token );
  76. }
  77.  
  78. void ClearImage( std::deque< std::string > &Token )
  79. {
  80.     for( int i = 0; i <= Height; ++i )
  81.         for( int j = 0; j <= Width; ++j )
  82.             Image[ i ][ j ] = 'O';
  83. }
  84.  
  85. void SetPixel( std::deque< std::string > &Token )
  86. {
  87.     int X = atoi(Token[1].c_str());
  88.     int Y = atoi(Token[2].c_str());
  89.     char Color = *Token[3].c_str();
  90.  
  91.     Image[ Y ][ X ] = Color;
  92. }
  93.  
  94. void VerticalLine( std::deque< std::string > &Token )
  95. {
  96.     int X = atoi(Token[1].c_str());
  97.     int Y = atoi(Token[2].c_str());
  98.     int Y2 = atoi(Token[3].c_str());
  99.     char Color = *Token[4].c_str();
  100.  
  101.     if( Y2 < Y )
  102.         std::swap( Y, Y2 );
  103.  
  104.     for( int i = Y; i <= Y2; ++i )
  105.         Image[ i ][ X ] = Color;
  106. }
  107.  
  108. void HorizonLine( std::deque< std::string > &Token )
  109. {
  110.     int X = atoi(Token[1].c_str());
  111.     int X2 = atoi(Token[2].c_str());
  112.     int Y = atoi(Token[3].c_str());
  113.     char Color = *Token[4].c_str();
  114.  
  115.     if( X2 < X )
  116.         std::swap( X, X2 );
  117.  
  118.     for( int i = X; i <= X2; ++i )
  119.         Image[ Y ][ i ] = Color;
  120. }
  121.  
  122. void Square( std::deque< std::string > &Token )
  123. {
  124.     int X = atoi(Token[1].c_str());
  125.     int X2 = atoi(Token[2].c_str());
  126.     int Y = atoi(Token[3].c_str());
  127.     int Y2 = atoi(Token[4].c_str());
  128.     char Color = *Token[4].c_str();
  129.  
  130.     if( X2 < X )
  131.         std::swap( X, X2 );
  132.  
  133.     if( Y2 < 2 )
  134.         std::swap( Y, Y2 );
  135.  
  136.     for( int i = Y; i <= Y2; ++i )
  137.         for( int j = X; j <= X2; ++j )
  138.             Image[ i ][ j ] = Color;
  139. }
  140.  
  141. void MagicWord( std::deque< std::string > &Token )
  142. {
  143.     int X = atoi(Token[1].c_str());
  144.     int Y = atoi(Token[2].c_str());
  145.     char Color = *Token[3].c_str();
  146.     char OldColor = Image[ Y ][ X ];
  147.  
  148.     NearstFill( X, Y, Color, OldColor );
  149. }
  150.  
  151. void SaveImage( std::deque< std::string > &Token )
  152. {
  153.     std::cout << Token[1] << std::endl;
  154.  
  155.     for( int i = 1; i <= Height; ++i )  {
  156.         for( int j = 1; j <= Width; ++j )
  157.             std::cout << Image[ i ][ j ];
  158.        
  159.         std::cout << std::endl;
  160.     }
  161. }
  162.  
  163. void ExitProgram( std::deque< std::string > &Token )
  164. {
  165.     exit(0);
  166. }
  167.  
  168. void NearstFill( int X, int Y, char Color, char OldColor )
  169. {
  170.     if( Image[ Y ][ X ] == OldColor )   {
  171.        
  172.         Image[ Y ][ X ] = Color;
  173.  
  174.         if( X > 1 )
  175.             NearstFill( X - 1, Y, Color, OldColor );
  176.  
  177.         if( X < Width )
  178.             NearstFill( X + 1, Y, Color, OldColor );
  179.  
  180.         if( Y > 1 )
  181.             NearstFill( X, Y - 1, Color, OldColor );
  182.  
  183.         if( Y < Height )
  184.             NearstFill( X, Y + 1, Color, OldColor );
  185.     }
  186. }

  깔끔하게 해보려고 했지만 일단 그냥 푸는게 더 좋을것 같아서 대충대충 했습니다. 일단 결과물이 나와야 과정이 중요하지 않겠습니까^^? 그럼 새로운 한 주 잘보세요.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Algorithm" 분류의 다른 글

Algorithm Traning Book - 세 번째 문제 (0)2008/06/10
Algorithm Traning Book - 두 번째 문제 (0)2008/06/09
3n+1 Problem (0)2008/02/17
The Blocks Problem (0)2008/02/17
Maximum Sum (0)2008/02/17
2008/06/15 23:13 2008/06/15 23:13
TAG 알고리즘 트레이닝
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/78

댓글을 달아 주세요

◀ 이전페이지 1 ... 30 31 32 33 34 35 36 37 38 ... 110 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (110)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (24)
  • Intel 64 And IA32 Arch.... (2)
  • 한게임 자동테트리스 Ve.... (24)

최근에 달린 댓글

  • 다운어덯게 받아요. difl 2008
  • 멋있네요 ㅎㅎ. 준호씨 2008
  • ^^; 그러셨군요.. 사실 동영.... 귀차니스트 2008
  • ㅋㅋ 속도 튜닝의 무서움 ㅜ.... 귀차니스트 2008
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)

태그목록

  • 상속
  • 준비
  • 인코딩
  • 폰트
  • Decompiler
  • 파티션
  • boost
  • ostream_iterator
  • Filtering
  • 6GB
  • SSD
  • 병렬처리
  • C#
  • smart Pointer
  • Linux
  • Programming
  • 버퍼 오버플로우
  • 책
  • FreeType
  • High Precision Event Timer
  • Array
  • 키보드
  • Logitech
  • 한글
  • ACM-ICPC
  • i++
  • boost::shared_ptr
  • istream_iterator
  • Secure
  • 개발

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net