CF69D Solution

题目链接

题解

⭐:①记忆化搜索的时间复杂度为状态数( imes)决策数 ②记忆化搜索(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;
} 
原文地址:https://www.cnblogs.com/violetholmes/p/14555822.html