Run Time: 0.110
Ranking (as of 2019-04-14): 243 out of 557
Language: C++
/* UVa 211 - The Domino Effect To build using Visual Studio 2012: cl -EHsc -O2 UVa_211_The_Domino_Effect.cpp */ #include <cstdio> #include <cstring> const int nr_bones = 28, nr_rows = 7, nr_cols = 8; const int bones[nr_bones][2] = { {0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {4, 4}, {4, 5}, {4, 6}, {5, 5}, {5, 6}, {6, 6} }; int grid[nr_rows][nr_cols], nr_maps, map[nr_rows][nr_cols]; void print_grid_or_map(int grid_or_map[nr_rows][nr_cols]) { for (int i = 0; i < nr_rows; i++) { for (int j = 0; j < nr_cols; j++) printf("%4d", grid_or_map[i][j]); putchar('\n'); } putchar('\n'); } void domino_effect(int bi) { if (bi == nr_bones) { nr_maps++; print_grid_or_map(map); return; } int pf = bones[bi][0], ps = bones[bi][1], bn = bi + 1; for (int i = 0; i < nr_rows; i++) for (int j = 0; j < nr_cols; j++) { if (j < nr_cols - 1 && !map[i][j] && !map[i][j + 1] && (grid[i][j] == pf && grid[i][j + 1] == ps || grid[i][j] == ps && grid[i][j + 1] == pf)) { map[i][j] = map[i][j + 1] = bn; domino_effect(bi + 1); map[i][j] = map[i][j + 1] = 0; } if (i < nr_rows - 1 && !map[i][j] && !map[i + 1][j] && (grid[i][j] == pf && grid[i + 1][j] == ps || grid[i][j] == ps && grid[i + 1][j] == pf)) { map[i][j] = map[i + 1][j] = bn; domino_effect(bi + 1); map[i][j] = map[i + 1][j] = 0; } } } int main() { for (int ln = 1; ; ln++) { if (scanf("%d", &grid[0][0]) == EOF) break; for (int j = 1; j < nr_cols; j++) scanf("%d", &grid[0][j]); for (int i = 1; i < nr_rows; i++) for (int j = 0; j < nr_cols; j++) scanf("%d", &grid[i][j]); if (ln > 1) printf("\n\n\n"); printf("Layout #%d:\n\n", ln); print_grid_or_map(grid); printf("Maps resulting from layout #%d are:\n\n", ln); nr_maps = 0; memset(map, 0, sizeof(map)); domino_effect(0); printf("There are %d solution(s) for layout #%d.\n", nr_maps, ln); } return 0; }
No comments:
Post a Comment