CF69D Solution
题解
⭐:①记忆化搜索的时间复杂度为状态数\(\times\)决策数 ②记忆化搜索(dfs)为博弈论题目常见解法
记忆化搜索,\(ans[i][j]\)表示当前轮在点\((i,j)\)上玩家的输/赢(\(0/1\))。只要当前可以转移到的状态中有一个为赢,则当前状态为输(因为玩家极聪明)。Tips:因为坐标可以为负,在保存作数组下标时需要加偏移值。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=25,off=210;
int x[N],y[N],n,d,ans[2*off][2*off];
bool dfs(int tx,int ty)
{
if((tx-off)*(tx-off)+(ty-off)*(ty-off)>d*d) return 1;
if(ans[tx][ty]!=-1) return ans[tx][ty];
ans[tx][ty]=0;
for(int i=1;i<=n;i++)
if(!dfs(tx+x[i],ty+y[i])) ans[tx][ty]=1;
return ans[tx][ty];
}
int main()
{
int sx,sy;
scanf("%d%d%d%d",&sx,&sy,&n,&d);
sx+=off,sy+=off;
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
memset(ans,-1,sizeof(ans));
if(dfs(sx,sy)) printf("Anton");
else printf("Dasha");
return 0;
}