5754Life Winner Bo

给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车)。起点在(1,1)先走到(n,m)获胜。

分析:车是nim博弈。王后是威佐夫博弈。王和骑士写两个1000*1000的预处理即可。

hdu5754Life Winner Bo 题目连接

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1010;
 7 int f[N][N],g[N][N];
 8 void deal1()
 9 {
10     int i,j;
11     f[1][1]=1;
12     for(i=1;i<=1000;i++)
13     for(j=1;j<=1000;j++)
14     {
15
16        if(i==1&&j==1)continue;
17        else
18        {
19            f[i][j]=1;
20             if(i>1&&f[i-1][j]==1)f[i][j]=0;
21             if(j>1&&f[i][j-1]==1)f[i][j]=0;
22             if(i>1&&j>1&&f[i-1][j-1]==1)f[i][j]=0;
23        }
24     }
25 }
26
27 void deal2()
28 {
29     int i,j,d,e;
30     g[1][1]=0;g[2][2]=-1;
31     for(i=2;i<=1000;i++)g[1][i]=g[i][1]=-1;
32     for(i=2;i<=1000;i++)
33     for(j=2;j<=1000;j++)
34     {
35         if(j==2&&i==2)continue;
36         else
37         {
38                 d=0;e=0;
39             if(i>2)d++;if(j>2)d++;
40             if(i>2&&g[i-2][j-1]==1)e++;
41             if(j>2&&g[i-1][j-2]==1)e++;
42             if(d==e)g[i][j]=0;//所有的后继都为必胜,则它为必败态
43             else
44             {
45                 if((j>2&&g[i-1][j-2]==0)||(i>2&&g[i-2][j-1]==0))
46                 g[i][j]=1;//后继有一个必败态,则它为必胜态
47                 else
48                 g[i][j]=-1;//不是必胜态或必败态那么这个位置不满足条件
49             }
50         }
51
52     }
53 }
54 int main()
55 {
56
57     int i,x,n,m,t,xo;
58     scanf("%d", &t);
59     deal1();deal2();
60     while (t--) {
61         scanf("%d%d%d", &x, &n, &m);
62         if (x==1) {
63             if (f[n][m]==0) printf("B\n");
64             else printf("G\n");
65         } else if (x==2) {
66             xo=(n-1)^(m-1);  //因为第一个位置是(1,1),不是(0,0);
67             if (xo) printf("B\n");
68             else printf("G\n");
69         } else if (x==3) {
70             if (g[n][m]==-1) printf("D\n");
71             else if (g[n][m]==1) printf("B\n");
72                 else printf("G\n");
73         } else {
74             n--;m--;  //同理
75             if (n>m) swap(n,m);
76             x=(int)(n*(sqrt(5)-1)/2);
77             if (n==(int)(x*(1+sqrt(5))/2)&&n+x==m) printf("G\n");
78             else if (n==(int)((x+1)*(1+sqrt(5))/2)&&n+x+1==m) printf("G\n");
79                 else printf("B\n");
80         }
81     }
82     return 0;
83 }
时间: 2024-10-29 10:46:14

5754Life Winner Bo的相关文章

HDU 5754 Life Winner Bo 组合博弈

Life Winner Bo Problem Description Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G. The size of the chessboard is N×M.The top left corner is numbered(1,1) and the lower right corner is numberd (N,M). For each game,B

HDU-5754 Life Winner Bo (博弈论)

好久没有整题目了,并不是没有好的题目整,只是自己懒了太懒了太懒了...赶紧整理几个题补一下自己的罪过... Description Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G.The size of the chessboard is N×M .The top left corner is numbered(1,1) and the lower right corner is

【博弈论】HDU 5754 Life Winner Bo

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一开始棋子在(1,1),谁先走到(n,m)谁赢,无法走动算平局D. (n,m<=1000,case<=1000) 题目思路: [博弈论] 这题博弈论.怎样都输为必败,只能走到必败的为必胜. 王:(王可以横竖斜走一格)如果n个m均为奇数先手必败,否则必胜. 从3x3格子看,当n和m均为奇数时先手必败,

HDU 5754 Life Winner Bo 2016多校第三场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754 题意:给你一个n*m大小的棋盘,分别以国际象棋的国王.战车.骑士和皇后的走法从(1,1)走到(n,m),而且只能向右或者向下走,问谁有必胜的策略或者是两者平局. 题解:无论是哪一种移动,都可以注意到,如果从起点到某一个点有必胜的策略,那么再以必胜点作为起点可以走到下一个必胜点,也就是以小见大. 一.对于王的走法,可以注意到3*3大小的棋盘,从(1,1)到(3,3)后手是有必胜的策略的,对于N和

SAP BO 技术

1.联接路径问题: – 环路 在关系数据库模式中,返回太少行的一种常见联接路径称为环路,环路是一组联接,   它定义了经过模式中的一组表的闭合联接,如下图: 解决办法:创建别名表(基表的副本). – 断层陷阱(chasmtrap) 断层陷阱是关系数据库模式中的一种常见问题,其中联接路径返回了比预计更多的数据,断层陷阱是当两个"多对一" 联接会聚在一个表上时三个表之间的一种联接路径, 并且没有适当地分隔会聚联接路径中的上下文,如下图: 解决办法:为每个事实表创建一个上下文,此方法适用于所

CodeForces-2015 HIAST Collegiate Programming Contest-Gym-100952A-Who is the winner?

A. Who is the winner? time limit per test 1 second memory limit per test 64 megabytes input standard input output standard output A big marathon is held on Al-Maza Road, Damascus. Runners came from all over the world to run all the way along the road

[转]java的(PO,VO,TO,BO,DAO,POJO)类名包名解释

java的(PO,VO,TO,BO,DAO,POJO)类名包名解释 2015-04-28 20:11 by Loull, 18 阅读, 0 评论, 收藏, 编辑 VO:值对象.视图对象 PO:持久对象 QO:查询对象 DAO:数据访问对象——同时还有DAO模式 DTO:数据传输对象——同时还有DTO模式 PO:全称是persistant object持久对象最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是business

理解Java中的VO,PO,BO

VO(Value Object):值对象 PO(Persistent Object):持久对象 两者从结构上来说完全相同,都是拥有一组属性和getter.setter方法组成.但它们的本质和用处却完全不同: VO是在业务层的对象 供业务逻辑使用,VO的属性就是当前业务逻辑需要的数据的名称. PO是数据库里数据的对象表示,它的属性与数据库里字段相对应. BO(Business Object):业务对象 把业务逻辑封装成一个Java对象,这个对象可以包含一个或多个其他的对象,通过调用DAO层的方法对

初步学习:VO,BO和PO

刚到这个公司前几天,被安排的看文档,主要是对现在这个项目的技术选型以及框架的基本了解.用的也是现在公司常用的框架Spring,struts和MyBatis.了解起来感觉还是挺简单的,不过被一堆VO,BO和PO给搞得不清不楚的,现在也开发了几条线了,有了一些初步的了解,先总结总结. PO:persistantobject持久对象.在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.可以看成是与数据库中的表相映射的java对象. 最形象的理解就是一个PO就是数据库中的一条记录.多个