/home/toolbox/public_html/solutions/102/10267/b.c
1 #include <stdio.h>
2
3 #define TRUE (1 == 1)
4 #define FALSE (1 != 1)
5 #define NAMEMAX 20
6 #define MAXWIDTH 300
7 #define MAXHEIGHT 300
8 #define SIZE 250
9
10 typedef struct COMMAND_STRUCT
11 {
12 // struct COMMAND_STRUCT
13 char cmd;
14 int x1;
15 int x2;
16 int y1;
17 int y2;
18 char color;
19 char name[NAMEMAX];
20 } // struct COMMAND_STRUCT
21 COMMAND_STRUCT;
22
23 void dump(COMMAND_STRUCT c)
24 {
25 // FUNCTION BEGIN dump
26 printf("%c %d %d %d %d %c - [%s]\n", c.cmd, c.x1, c.x2, c.y1, c.y2, c.color, c.name);
27 } // FUNCTION END dump
28
29 int getInput(COMMAND_STRUCT *c)
30 {
31 // BEGIN FUNCTION getInput
32 char x;
33
34 // safety
35 // (*c).x1 = -99;
36 // (*c).x2 = -99;
37 // (*c).y1 = -99;
38 // (*c).y2 = -99;
39 // (*c).color = '.';
40 // (*c).name[0] = '\0';
41
42
43 scanf("%c ", &x);
44 (*c).cmd = x;
45 switch (x)
46 {
47 // switch
48 case 'C':
49 case 'X':
50 break;
51 case 'I':
52 // get Max X (max cols)
53 scanf("%d ",&(*c).x1);
54 // get Max Y (max rows)
55 scanf("%d ",&(*c).y1);
56 break;
57 case 'L':
58 case 'F':
59 // get x1
60 scanf("%d ",&(*c).x1);
61 // get y1
62 scanf("%d ",&(*c).y1);
63 // get color
64 scanf("%c ",&(*c).color);
65 break;
66 case 'V':
67 // get x1
68 scanf("%d ",&(*c).x1);
69 // get y1
70 scanf("%d ",&(*c).y1);
71 // get y2
72 scanf("%d ",&(*c).y2);
73 // get color
74 scanf("%c ",&(*c).color);
75 break;
76 case 'H':
77 // get x1
78 scanf("%d ",&(*c).x1);
79 // get x2
80 scanf("%d ",&(*c).x2);
81 // get y1
82 scanf("%d ",&(*c).y1);
83 // get color
84 scanf("%c ",&(*c).color);
85 break;
86 case 'K':
87 // get x1
88 scanf("%d ",&(*c).x1);
89 // get y1
90 scanf("%d ",&(*c).y1);
91 // get x2
92 scanf("%d ",&(*c).x2);
93 // get y2
94 scanf("%d ",&(*c).y2);
95 // get color
96 scanf("%c ",&(*c).color);
97 break;
98 case 'S':
99 // get name
100 scanf("%s ",(*c).name);
101 break;
102 default :
103 (*c).cmd = 'Z';
104 while ('\n' != getc(stdin));
105 } // switch
106 return ('X' != x);
107 } // END FUNCTION getInput
108
109 void fillHorz(int x1, int x2, int y1, char buffer[][MAXHEIGHT], char color)
110 {
111 // FUNCTION BEGIN fillVert
112 int j;
113
114 for (j=x1; j<=x2; j++)
115 buffer[y1][j] = color;
116 } // FUNCTION END fillVert
117
118 void fillVert(int x1, int y1, int y2, char buffer[][MAXHEIGHT], char color)
119 {
120 // FUNCTION BEGIN fillVert
121 int i;
122
123 for (i=y1; i<=y2; i++)
124 buffer[i][x1] = color;
125 } // FUNCTION END fillVert
126
127 void fillRect(int x1, int y1, int x2, int y2, char buffer[][MAXHEIGHT], char color)
128 {
129 // FUNCTION BEGIN fillRect
130 int j;
131
132 for (j=x1; j<=x2; j++)
133 fillVert(j, y1, y2, buffer, color);
134 } // FUNCTION END fillRect
135
136 void dumpBuffer(char buffer[][MAXHEIGHT], int M, int N, char name[])
137 {
138 // FUNCTION BEGIN dumpBuffer
139 int i;
140 int j;
141
142 printf("%s\n", name);
143 for (j=1; j<=N; j++)
144 {
145 // for j
146 for (i=1; i<=M; i++)
147 printf("%c", buffer[j][i]);
148 printf("\n");
149 } // for j
150 } // FUNCTION BEGIN dumpBuffer
151
152 void fill(int x, int y, char buffer[][MAXHEIGHT], int M, int N, char save)
153 {
154 // FUNCTION BEGIN fillArea
155 if ((x>0) && (x<=M) && (y>0) && (y<=N) && (save == buffer[y][x]))
156 {
157 // if
158 buffer[y][x] = '.';
159 fill(x, y+1, buffer, M, N, save);
160 fill(x, y-1, buffer, M, N, save);
161 fill(x+1, y, buffer, M, N, save);
162 fill(x-1, y, buffer, M, N, save);
163 } // if
164 } // FUNCTION END fillArea
165
166 void fillArea(int x, int y, char buffer[][MAXHEIGHT], int M, int N, char color)
167 {
168 // FUNCTION BEGIN fillArea
169 int i;
170 int j;
171 int changes;
172 char save;
173 int cnt = 0;
174 save = buffer[y][x];
175 fill(x, y, buffer, M, N, save);
176 // reset the '.' to desired color
177 for (j=1; j<=M; j++)
178 for (i=1; i<=N; i++)
179 if ('.' == buffer[i][j]) buffer[i][j] = color;
180 cnt++;
181 // printf("Iterations: %d\n", cnt);
182 } // FUNCTION END fillArea
183
184 int process(COMMAND_STRUCT c, char buffer[][MAXHEIGHT], int *M, int *N)
185 {
186 // BEGIN FUNCTION process
187 int i,j;
188 // dump(c);
189 switch (c.cmd)
190 {
191 // switch
192 case 'I':
193 // for (i=0; i<MAXHEIGHT; i++)
194 // for (j=0; j<MAXWIDTH; j++)
195 // buffer[j][i] = '*';
196 *M = c.x1;
197 *N = c.y1;
198 fillRect(1, 1, *M, *N, buffer, 'O');
199 break;
200 case 'C':
201 fillRect(1, 1, *M, *N, buffer, 'O');
202 break;
203 case 'L':
204 buffer[c.y1][c.x1] = c.color;
205 break;
206 case 'F':
207 fillArea(c.x1, c.y1, buffer, *M, *N, c.color);
208 break;
209 case 'V':
210 fillVert(c.x1, c.y1, c.y2, buffer, c.color);
211 break;
212 case 'H':
213 fillHorz(c.x1, c.x2, c.y1, buffer, c.color);
214 break;
215 case 'K':
216 fillRect(c.x1, c.y1, c.x2, c.y2, buffer, c.color);
217 break;
218 case 'S':
219 dumpBuffer(buffer, *M, *N, c.name);
220 break;
221 } // switch
222 } // END FUNCTION process
223
224 int main ()
225 {
226 // main
227 int moreToDo;
228 COMMAND_STRUCT c;
229 char buffer[MAXWIDTH][MAXHEIGHT];
230 int M;
231 int N;
232
233 // init();
234 moreToDo = getInput(&c);
235 while (moreToDo)
236 {
237 // while
238 process(c, buffer, &M, &N);
239 moreToDo = getInput(&c);
240 } // while
241
242 return 1;
243 } // main
244