CodeForces 69D Dot :两个人轮流移动棋子,移动方法有n种,谁先移动到距离原点>d则输,问谁赢 :博弈+记忆化...

其实本题还有一个可以沿y=x对称的操作,但仔细思考会发现其并不影响

对于一个点,比如A当前先走,只要找到一个他可以跳的地方且B从这儿必跪的A就必胜=否则A跪

所以可以用记忆化dfs来写,复杂度大概200*200*20

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int x0,y0,dp[405][405],n,d;
 6 int x[405],y[405];
 7 int check(int tx,int ty)
 8 {
 9   if ((tx-200)*(tx-200)+(ty-200)*(ty-200)<=d*d) return 1;
10   return 0; 
11 }
12 int dfs(int tx,int ty)
13 {
14   if (dp[tx][ty]!=-1) return dp[tx][ty];
15   for (int i=1;i<=n;i++)
16     if (check(tx+x[i],ty+y[i])&&dfs(tx+x[i],ty+y[i])==0) 
17       return dp[tx][ty]=1;
18   return dp[tx][ty]=0;
19 }
20 int main()
21 {
22   scanf("%d%d%d%d",&x0,&y0,&n,&d);
23   for (int i=1;i<=n;i++)
24     scanf("%d%d",&x[i],&y[i]);
25   memset(dp,-1,sizeof(dp));
26   if (dfs(x0+200,y0+200)) printf("Anton\n");
27   else printf("Dasha\n");
28 }
View Code

题目链接:http://codeforces.com/problemset/problem/69/D

转载于:https://www.cnblogs.com/xiao-xin/articles/4370505.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值