###### tags: `I2P(I)Hu2022` # 13685 - Hot-Cross-Bun > by schdoel ## Brief There's a n x m grid, in each grid there is exactly one treat; a donut, 'o' or a hot cross bun, 'x'. If the treat on gridij is a donut, 'o' , you can change it to a hot cross bun, 'x'. ('o' -> 'x') and vice versa. And all the other treat inside the grid (i-1, j), (i, j-1), (i, j+1) and (i+1, j) will also be changed. Just like the shape of a hot cross bun ! ## Solution ## Reference Code ```cpp= #include <stdio.h> int n, m; char grid[21][21]; long min = -1; int dr[5] = {0, 0, 0, -1, 1}; int dc[5] = {0, -1, 1, 0, 0}; void cross(int row, int col, int count) { if (row == n + 1) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (grid[i][j] == 'o') return; } } if (min == -1 || count < min) min = count; } else { int nextrow = row; int nextcol = col + 1; if (nextcol == m + 1) { nextrow++; nextcol = 1; } cross(nextrow, nextcol, count); for (int i = 0; i < 5; i++) { if (grid[row + dr[i]][col + dc[i]] == 'o' && (row + dr[i] <= n) && (col + dc[i] <= m)) grid[row + dr[i]][col + dc[i]] = 'x'; else if (grid[row + dr[i]][col + dc[i]] == 'x' && (row + dr[i] <= n) && (col + dc[i] <= m)) grid[row + dr[i]][col + dc[i]] = 'o'; } cross(nextrow, nextcol, count + 1); for (int i = 0; i < 5; i++) { if (grid[row + dr[i]][col + dc[i]] == 'o' && (row + dr[i] <= n) && (col + dc[i] <= m)) grid[row + dr[i]][col + dc[i]] = 'x'; else if (grid[row + dr[i]][col + dc[i]] == 'x' && (row + dr[i] <= n) && (col + dc[i] <= m)) grid[row + dr[i]][col + dc[i]] = 'o'; } } } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf(" %c", &grid[i][j]); } } cross(1, 1, 0); if (min == -1) printf("no solution\n"); else printf("%ld\n", min); return 0; } ```