码迷,mamicode.com
首页 > 其他好文 > 详细

poj3537--Crosses and Crosses

时间:2016-03-11 20:24:22      阅读:149      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!