HDU 2147 找规律博弈

题目大意:

从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜

到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关

开始写了一个把所有情况都计算的打表

for(int i=n ; i>=1 ; i--){
            for
(int j=1 ; j<=m ; j++){
                bool
flag1 = p[i][j-1];
                bool
flag2 = p[i+1][j];
                bool
flag3 = p[i+1][j-1];
                if
(flag1 || flag2 || flag3) p[i][j] = false;
                else
p[i][j] = true;
            }
        }

但貌似因为样例太多就超时了

根据自己所打的表画个表格标注当前格子的状态就很容易找到规律

任意两个必胜态的行差和列差都是2的倍数

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define N 2005
 5 bool p[N][N];
 6
 7 int main()
 8 {
 9    // freopen("a.in" , "r" , stdin);
10     int n,m;
11     while(scanf("%d%d" , &n , &m) , n||m)
12     {
13         if((m-1)&1 || (n-1)&1) puts("Wonderful!");
14         else puts("What a pity!");
15     }
16     return 0;
17 }
时间: 2024-12-21 12:30:56

HDU 2147 找规律博弈的相关文章

HDU 1564 找规律博弈

题目大意是: 从n*n的方格角落的一个起点出发,每次移到上下左右一个未曾到达过的位置,谁不能走了谁就输了 想了好久都想不出,看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发,将所有方格两两连接,如果为偶数,那么这个起点会有一个对应方格与其两两连接,那么起点说明已经占据了一格 那么每次先手只要走到当前格对应相连的格子上就保证可以有路,那么后手就输了 反之n为基数,那么没有点与起点相连,说明先手必然走入一个新的1*2的小长条中,那么后手始终有1*2的小长条的方格与其对应,所以

hdu 1525 找规律博弈 (根据每一步的必然性以及可选择性决策)

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 给出两个数,a和b,将大的数中,减去若干b的倍数,最终有一个数为0的话就胜了. 分析:  两个数a和b, 不妨设(a > b),总会出现的一个局面是b,a%b,这是必然的,如果a>=b&&a<2*b,那么只有一种情况,直接到b,a%b.否则有多种情况. a / b == 1   即a Ε [b , 2b)  , 下一步 只能到达   (b , a  - b) a

题解报告:hdu 1564 Play a game(找规律博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1564 Problem Description New Year is Coming! ailyanlu is very happy today! and he is playing a chessboard game with 8600.The size of the chessboard is n*n. A stone is placed in a corner square. They play

2017EC Final L SOS——找规律&amp;&amp;博弈

题意 有n个格子排成一行,两人轮流填,可填入"S"或"0",先得到"SOS"的人胜:如果全部填完也没有出现"SOS",则为平局.请判断是先手胜.后手胜还有平局. 分析 第一次知道,博弈题也能打表找规律. 简单地说就是,给DFS一个返回值,返回三个不同的值分别代表先手胜.后手胜和平局. 枚举当前填的格子,如果出现后手出现必败态,先手胜,直接返回:如果后手出现平局,则存在平局:否则,后手败. (好像超内存了...问题不大 不难得出

Calendar Game(找规律+博弈)

A - Calendar Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 1024 Appoint description:  System Crawler  (2015-08-02) Description Adam and Eve enter this year's ACM International Collegiate Pr

HDU 5963 朋友(找规律博弈)

http://acm.hdu.edu.cn/showproblem.php?pid=5963 题意: 思路: 我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操作,也就是1次就可以,而别的都需要偶数次操作才能把这条链上的边权全变成0,次数为$2^{n-1}$,n为边的层数.所以我们只要统计与根相连的有多少条权值为1的边即可. 需要改权值的时候搜索一下找到边然后修改. 1 #include<iostream> 2 #include<algorithm

hdu 5229 找规律

假设选择了字符串a和b: 假设两人都按照最聪明的策略,那么观察一下可以找出规律:当a和b的字符串长度之和为奇数的时候zcc会败. 另外当a==b的时候zcc也会败(当时做的时候忘了这个了T^T) 接下来程序就好写了.总方案数是C(N,2)=N*(N-1) 判重要用map. 最后别忘了化简分数. 1 #include <iostream> 2 #include<cstring> 3 #include<map> 4 #include<vector> 5 usin

HDU 2147 P/N博弈

点这里去做题 如图 找必胜点和必败点, 1.终点为必胜点 2.所有能一步走到必胜点的都是必败点 3.每一步都只能走到必败点的是必胜点 #include<bits/stdc++.h> using namespace std; int main() { int i,j,m,n; while(scanf("%d%d",&n,&m)!=EOF) { if(m==0&&n==0)break; if(m%2==1&&n%2==1) pri

POJ 2505 A multiplication game(找规律博弈/贪心)

题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() { ll n; while(~scanf("%I64d",&n)) {//其实算是 贪心了吧 //先手想赢,他会x2,这样子才能尽量避免让后手赢 //后手想赢,他就会x9,只有乘最大的,他胜算才最大 int t=0; ll l=1,r=9; while(1) { if