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;
} 
posted @ 2021-03-25 22:24  violet_holmes  阅读(67)  评论(0编辑  收藏  举报