1. 程式人生 > >SHU-“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校金馬五校賽-I-丟史蒂芬妮

SHU-“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校金馬五校賽-I-丟史蒂芬妮

ACM模版

描述

描述

題解

與其說是博弈論問題,不如說是偽裝成博弈論的記憶化搜尋問題,通過記憶化搜尋來預處理出來所有狀態,然後直接訪問即可。

程式碼

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 555;

int n, m;
int prime[MAXN];
bool dp[MAXN][MAXN];
int vis[MAXN][MAXN];

bool dfs(int x, int y)
{
    if
(vis[x][y]) { return dp[x][y]; } vis[x][y] = true; for (int i = 1; i <= prime[0]; i++) { if (x - prime[i] > 0) { dp[x][y] |= (!dfs(x - prime[i], y)); } if (y - prime[i] > 0) { dp[x][y] |= (!dfs(x, y - prime[i])); } if
(x - prime[i] > 0 && y - prime[i] > 0) { dp[x][y] |= (!dfs(x - prime[i], y - prime[i])); } } return dp[x][y]; } void init() { memset(prime, 0, sizeof(prime)); for (int i = 2; i <= MAXN; i++) { if (!prime[i]) { prime[++prime[0
]] = i; } for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++) { prime[prime[j] * i] = 1; if (i % prime[j] == 0) { break; } } } for (int i = 1; i < MAXN; i++) { for (int j = 1; j < MAXN; j++) { dfs(i, j); } } } int main() { init(); int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); puts(dp[n][m] ? "Sora" : "Shiro"); } return 0; }