Problem
The simple graphical editor deals with a rectangular table M×N (1<=M,N<=250). Each pixel of the table has its colour. The picture is formed from this square pixels.
The problem is to write a program, which simulates an interactive work of the graphical editor.
Input
Input consists of the editor commands, one per line. Each command is represented by one Latin capital placed in the very beginning of the line. If the command supposes parameters, all the parameters will be given in the same line separated by space. As the parameters there may be: the coordinates of the pixel - two integers, the first one is the column number and belongs to 1..M, the second one is the row number and belongs to 1..N, the origin is in the upper left corner of the table; the colour - the Latin capital; file name - in MSDOS 8.3 format.
The editor deals with the following commands:
I M N | Creates a new table M×N. All the pixels are colored in white (O). |
C | Clears the table. The size remains the same. All the pixels became white (O). |
L X Y C | Colors the pixel with coordinates (X,Y) in colour C. |
V X Y1 Y2 C | Draws the vertical segment in the column X between the rows Y1 and Y2 inclusive in colour C. |
H X1 X2 Y C | Draws the horizontal segment in the row Y between the columns X1 and X2 inclusive in colour C. |
K X1 Y1 X2 Y2 C | Draws the filled rectangle in colour C. (X1,Y1) is the upper left corner, (X2,Y2) is the lower right corner of the rectangle. |
F X Y C | Fills the region with the colour C. The region R to be filled is defined as follows. The pixel (X,Y)belongs to this region. The other pixel belongs to the region R if and only if it has the same colour as pixel (X,Y) and a common side with any pixel which belongs to this region. |
S Name | Writes the picture in the file Name. |
X | Terminates the session. |
Output
Every time the command S NAME meets, you should output the file name NAME and the current table, row by row. Each row is represented by a pixels' colours series, see the output sample.
Errors
If as a command there will be a character different from I, C, L, V, H, K, F, S, X, the editor should ignore the whole line and pass to the next command.
In case of other errors the program behaviour is unpredictable.
Sample Input
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
Sample Output
one.bmp OOOOO OOOOO OAOOO OOOOO OOOOO OOOOO two.bmp JJJJJ JJZZJ JWJJJ JWJJJ JJJJJ JJJJJ
//----------------------------------------------------------------------------------------------------------------------------------------------------//
비교적 간단한 문제이다. 정해진 입력이 오면 정해진 기능을 수행하면 끝난다. 기능들이 전부 단순한 기능 밖에 없어서
다른 부분 구현은 그냥 타이핑 하듯이 슬슬 내려간다.
이 문제에서의 핵심은 "F 명령을 어떻게 처리할 것인가?" 이다. 자 어떻게 처리해야 할까? 떠오르는건 재귀 밖에 없으
니 재귀로 구현했다.
이런 종류의 재귀는 코딩을 조금 했다면, 아마 여러차례 해보았을 것이다. 단순하게, 현재 좌표의 색상이 기존의 (x,y)색
상과 동일하면, 색상을 바꾸고 다음 좌표들(좌,위,우,하 방향)로 재귀호출을 한다.
char matrix[250][250]; void fill(int X, int Y, char C, char B){ matrix[Y][X] = C; if( Y-1 >= 0 && matrix[Y-1][X] == B ) fill(X, Y-1, C, B); if( X-1 >= 0 && matrix[Y][X-1] == B ) fill(X-1, Y, C, B); if( Y+1 < N && matrix[Y+1][X] == B ) fill(X, Y+1, C, B); if( X+1 < M && matrix[Y][X+1] == B ) fill(X+1, Y, C, B); }
재귀 코드는 위와 같이 구현했다. C는 입력 받은 color이고, B는 기존의 (x,y)의 색상이다. 이 코드를 리눅스 터미널에서
돌리면 아무 문제없이 잘 돌아간다.
근데 Uva에 제출을 하면 위 부분에서 Runtime Error이 발생하는데 이거 도무지 이유를 모르겠다. 위 부분을 주석을 달고
제출하면 Wrong Answer이 나온다. 도대체 뭐가 문제일까.
'P > C++' 카테고리의 다른 글
The Trip (2) | 2014.06.27 |
---|---|
ACM 문제중 WERTYU (0) | 2013.09.06 |
링크드리스트로 하드디스크 흉내내기. (0) | 2012.11.13 |
Calling (0) | 2012.10.01 |
strlen(), strcpy() 구현 (0) | 2012.08.29 |