E-小d的博弈_牛客小白月赛70 (nowcoder.com)
博弈论打表找规律。
记忆化搜索:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int dp[100][100];
int dfs(int a, int b) {
if(a > b) return dfs(b, a);
if(dp[a][b]) return dp[a][b];
for(int i = 1; i <= a; i++) {
if(i == a - i) continue;
if(dfs(min(i, a - i), b) == -1) return dp[a][b] = 1;
}
for(int i = 1; i <= b; i++) {
if(i == b - i) continue;
if(dfs(a, min(i, b - i)) == -1) return dp[a][b] = 1;
}
return dp[a][b] = -1;
}
int main() {
for(int i = 1; i <= 80; i++) {
for(int j = 1; j <= 80; j++) {
printf("%c", dfs(i, j) == 1 ? 'O' : 'X');
} puts("");
}
return 0;
}
打一个下标从2开始的二维矩阵,可以看出当两个数的二进制位数相同时,就是必败态,也就是先手必败。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
void solve() {
int a, b;
cin >> a >> b;
a++, b++;
if((int)log2(a) == (int)log2(b)) cout << "Bob" << endl;
else cout << "Alice" << endl;
}
int main() {
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}