/home/toolbox/public_html/solutions/105/10592/b.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <stdlib.h>
7 #include <math.h>
8 #include <stdint.h>
9
10 #define TRUE (1 == 1)
11 #define FALSE (1 != 1)
12
13 #define DEBUG if (FALSE)
14
15 /* fprintf(stderr, "functionName: message", varslist); */
16
17 /*
18 * Author: Isaac Traxler
19 * Date: 2020-10-31
20 * Purpose: fun
21 * Problem: 10592 - Freedom Fighter
22 */
23
24 /*
25 * This template reads data a specified number of times.
26 */
27
28 #define MAX_GRID 55
29 #define EMPTY_CHAR '.'
30 #define SECTOR_CHAR '*'
31 #define FREEDOM_CHAR 'B'
32 #define freedom_CHAR 'b'
33 #define ENEMY_CHAR 'P'
34 #define enemy_CHAR 'p'
35 #define BOUNDARY '!'
36 #define VISITED '&'
37
38 int gridSize;
39 char grid[MAX_GRID][MAX_GRID];
40 int fightingGroups;
41 int freedom;
42 int enemy;
43 int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1};
44 int dy[8] = {1, 0, -1, 1, -1, 1, 0, -1};
45
46 void init()
47 {
48 /* FUNCTION init */
49 int i;
50
51 for (i=0; (gridSize+2)>i; i++)
52 {
53 /* for i */
54 grid[0][i] = BOUNDARY;
55 grid[gridSize+1][i] = BOUNDARY;
56 grid[i][0] = BOUNDARY;
57 grid[i][gridSize+1] = BOUNDARY;
58 } /* for i */
59 } /* FUNCTION init */
60
61 void dump()
62 {
63 /* FUNCTION dump */
64 int i;
65 int j;
66
67 for (i=0; gridSize+1>=i; i++)
68 {
69 /* for i */
70 for (j=0; gridSize+1>=j; j++)
71 {
72 /* for j */
73 printf("%c", grid[i][j]);
74 } /* for j */
75 printf("\n");
76 } /* for i */
77 printf("\n");
78 } /* FUNCTION dump */
79
80 int getInput()
81 {
82 /* FUNCTION getInput */
83 int i;
84 int j;
85 char tmp;
86 int moreToDo;
87
88 scanf(" %d ", &gridSize);
89 moreToDo = (0 != gridSize);
90
91 if (moreToDo)
92 {
93 /* data to read */
94 for (i=1; gridSize>=i; i++)
95 {
96 /* for i */
97 for (j=1; gridSize>=j; j++)
98 {
99 /* for j */
100 scanf("%c", &grid[i][j]);
101 } /* for j */
102 scanf("%c", &tmp); /* skip over end of line */
103 } /* for i */
104 } /* data to read */
105 return moreToDo;
106 } /* FUNCTION getInput */
107
108 int check(int x, int y)
109 {
110 /* FUNCTION check */
111 int ret;
112
113 ret = (SECTOR_CHAR == grid[x][y]) || (FREEDOM_CHAR == grid[x][y]) || (ENEMY_CHAR == grid[x][y]);
114 return ret;
115 } /* FUNCTION check */
116
117 void fill(int x, int y, char g)
118 {
119 /* FUNCTION fill */
120 int i;
121 if (check(x, y))
122 {
123 /* check */
124 DEBUG printf("fill(%d,%d) %c - %c\n", x, y, grid[x][y], g);
125 if (SECTOR_CHAR == grid[x][y])
126 {
127 grid[x][y] = g;
128 }
129 if (FREEDOM_CHAR == grid[x][y])
130 {
131 grid[x][y] = freedom_CHAR;
132 }
133 if (ENEMY_CHAR == grid[x][y])
134 {
135 grid[x][y] = enemy_CHAR;
136 }
137 for (i=0; 8>i; i++)
138 {
139 /* for each possible move */
140 fill(x+dx[i], y+dy[i], g);
141 } /* for each possible move */
142 } /* check */
143 } /* FUNCTION fill */
144
145 void countGroup(int x, int y, char g)
146 {
147 /* FUNCTION countGroup */
148 int i;
149
150 switch (grid[x][y])
151 {
152 /* process each char */
153 case freedom_CHAR:
154 freedom++;
155 grid[x][y] = VISITED;
156 for (i=0; 8>i; i++)
157 {
158 countGroup(x+dx[i], y+dy[i], g);
159 }
160 break;
161 case enemy_CHAR:
162 enemy++;
163 grid[x][y] = VISITED;
164 for (i=0; 8>i; i++)
165 {
166 countGroup(x+dx[i], y+dy[i], g);
167 }
168 break;
169 default:
170 if (g == grid[x][y])
171 {
172 /* current sector */
173 grid[x][y] = VISITED;
174 for (i=0; 8>i; i++)
175 {
176 countGroup(x+dx[i], y+dy[i], g);
177 }
178 } /* current sector */
179 } /* process each char */
180 } /* FUNCTION countGroup */
181
182 void process()
183 {
184 /* FUNCTION process */
185 int i;
186 int j;
187 char group = 'q';
188
189 init();
190 dump();
191 for (i=1; gridSize>=i; i++)
192 {
193 /* for i */
194 for (j=1; gridSize>=j; j++)
195 {
196 /* for j */
197 if (SECTOR_CHAR == grid[i][j])
198 {
199 /* found a sector */
200 fill(i, j, group);
201 freedom = 0;
202 enemy = 0;
203 dump();
204 countGroup(i, j, group);
205 group++;
206 printf("Sector #%d: contain %d freedom fighter group(s) & %d enemy group(s)\n", (group-'q'), freedom, enemy);
207 } /* found a sector */
208 } /* for j */
209 } /* for i */
210 dump();
211 printf("Total %d group(s) are in fighting position.\n", fightingGroups);
212 } /* FUNCTION process */
213
214 int main()
215 {
216 /* main */
217 int i;
218 int moreToDo;
219
220 moreToDo = getInput();
221 while (moreToDo)
222 {
223 /* while */
224 process();
225 moreToDo = getInput();
226 } /* while */
227
228 return EXIT_SUCCESS;
229 } /* main */
230
231