Run Time: 0.000
Ranking (as of 2016-06-25): 23 out of 408
Language: C++
/* UVa 11957 - Checkers To build using Visual Studio 2012: cl -EHsc -O2 UVa_11957_Checkers.cpp */ #include <cstdio> const int N_max = 100, divisor = 1000007; char board[N_max][N_max + 1]; int N, nr_paths[N_max][N_max]; // nr_paths[y][x] is the number of paths to the cell (x, y) int from_left(int y, int x, bool jumped) { y++, x--; if (y < N && x >= 0) { if (board[y][x] != 'B') return nr_paths[y][x]; else return (jumped) ? 0 : from_left(y, x, true); } else return 0; } int from_right(int y, int x, bool jumped) { y++, x++; if (y < N && x < N) { if (board[y][x] != 'B') return nr_paths[y][x]; else return (jumped) ? 0: from_right(y, x, true); } else return 0; } int main() { int T; scanf("%d", &T); for (int t = 1; t <= T; t++) { scanf("%d", &N); int sy, sx; for (int y = 0; y < N; y++) { scanf("%s", board[y]); for (int x = 0; x < N; x++) if (board[y][x] == 'W') sy = y, sx = x; } for (int y = 0; y < N; y++) for (int x = 0; x < N; x++) nr_paths[y][x] = 0; nr_paths[sy][sx] = 1; for (int y = sy - 1; y >= 0; y--) for (int x = 0; x < N; x++) if (board[y][x] != 'B') nr_paths[y][x] = (from_left(y, x, false) + from_right(y, x, false)) % divisor; int nr = 0; for (int x = 0; x < N; x++) { nr += nr_paths[0][x]; nr %= divisor; } printf("Case %d: %d\n", t, nr); } return 0; }
No comments:
Post a Comment