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

posted on 2015-03-27 00:16  xiao_xin  阅读(246)  评论(0编辑  收藏  举报

导航