首页 > 其他 > 详细

poj3537--Crosses and Crosses

时间:2016-03-11 20:21:09      阅读:160      评论:0      收藏:0      [点我收藏+]

题意:有个一维棋盘,两人轮流下棋,然后谁连成三个谁赢

记得去年fj夏令营有见过这题,但是太弱了, 不会做。

记忆化搜索,如果n<=3肯定先手必胜,递推即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int sg[2005],n;
 8 int dfs(int n){
 9     if (sg[n]!=-1) return sg[n];
10     if (n<=3) return sg[n]=1;
11     int h[2005];
12     memset(h,0,sizeof h);
13     for (int i=1;i<=n;i++){
14         if (i>3){
15             if (i<n-2)
16              h[dfs(n-i-2)^dfs(i-3)]=1;
17             else
18              h[dfs(i-3)]=1; 
19         }
20         else{
21         if (i<n-2)
22         {h[dfs(n-i-2)]=1;}
23         else
24         h[0]=1;}
25     }
26     int i;
27     for (i=0;h[i];i++);
28     return sg[n]=i;
29 }
30 int main(){
31     memset(sg,-1,sizeof sg);
32     while (~scanf("%d",&n)){
33     if (dfs(n)) printf("1\n");else printf("2\n");}
34 }

 

poj3537--Crosses and Crosses

原文:http://www.cnblogs.com/qzqzgfy/p/5266829.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!