#include #include #include #include #include /** * Determines if there is a winning strategy in 1,2,3 Nim under * normal play when there are n sticks left. * * @param n a nonnegative integer */ bool nim_rec(int n); bool nim_dp(int n); int main(int argc, char **argv) { if (argc < 2 || strlen(argv[1]) == 0 || !isdigit(argv[1][0])) { fprintf(stderr, "USAGE: %s n\n", argv[0]); return 1; } int n = atoi(argv[1]); printf("%s\n", nim_dp(n) ? "WIN" : "LOSS"); } bool nim_rec(int n) { if (n < 4) { return (n != 0); // normal play: last move wins } else { return !nim_rec(n - 1) || !nim_rec(n - 2) || !nim_rec(n - 3); } } bool nim_dp(int n) { bool win[n < 4 ? 4 : n + 1]; win[0] = false; // opponent just took last stick and won win[1] = true; // take 1 stick and win win[2] = true; // take 2 sticks and win win[3] = true; // take 3 sticks and win for (int i = 4; i <= n; i++) { win[i] = !win[i - 1] || !win[i - 2] || !win[i - 3]; } return win[n]; }