#include<bits/stdc++.h>
using namespace std;
int n,m,k,l;
int x[1007],y[1007],z[1007];
int dp[1007][207];
void init()//预处理n次处理后的情况
{
    for(int i=0;i<=l+100;i++)
        dp[n+1][i]=-1;
    for(int i=l+101;i<k+100;i++)
        dp[n+1][i]=0;
    for(int i=k+100;i<=200;i++)
        dp[n+1][i]=1;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&k,&l);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&x[i],&y[i],&z[i]);
    }
    init();
    int a,b,c;
    for(int i=n;i>=1;i--)//已知n次处理后的情况,向前递推
    {
        for(int j=0;j<=200;j++)//枚举每一个分数
        {
            a=-1,b=-1,c=-1;
            if(x[i])
            {
                if(j+x[i]>200)
                    a=200;
                else
                    a=j+x[i];
            }
            if(y[i])
            {
                if(j-y[i]<0)
                    b=0;
                else
                    b=j-y[i];
            }
            if(z[i])
            {
                c=200-j;
            }
            if(i&1)
            {
                if(((a>=0)&&(dp[i+1][a]==1))||((b>=0)&&(dp[i+1][b]==1))||((c>=0)&&(dp[i+1][c]==1)))//任何一种情况可以到达后一种胜利的情况都可以
                {
                    dp[i][j]=1;
                    continue;
                }
                if(((a==-1)||(dp[i+1][a]==-1))&&((b==-1)||(dp[i+1][b]==-1))&&((c==-1)||(dp[i+1][c]==-1)))//别无其他选择只能走入失败的局面
                {
                    dp[i][j]=-1;
                    continue;
                }
                dp[i][j]=0;//虽然赢不了但也输不了
            }
            else//另一个人的视角
            {
                if(((a>=0)&&(dp[i+1][a]==-1))||((b>=0)&&(dp[i+1][b]==-1))||((c>=0)&&(dp[i+1][c]==-1)))
                {
                    dp[i][j]=-1;
                    continue;
                }
                if(((a==-1)||(dp[i+1][a]==1))&&((b==-1)||(dp[i+1][b]==1))&&((c==-1)||(dp[i+1][c]==1)))
                {
                    dp[i][j]=1;
                    continue;
                }
                dp[i][j]=0;
            }
        }
    }
    //相当于已经计算好了以后的每一步,类比象棋
    if(dp[1][m+100]==1)
        printf("Good Ending");
    else if(dp[1][m+100]==0)
        printf("Normal Ending");
    else
        printf("Bad Ending");
    return 0;
}
//当时想了很久,错误在于正向推进使得最后情况过多,实际上正难则反,也可以深度搜索模拟类似的情况,即从第一步开始去寻找一定会赢或者输的情况

最新文章

  1. VBS实现定时发送邮件
  2. linux TCP Wrappers
  3. 【笔记】Python 学习Tips
  4. IO流的练习1 —— 随机获取文本中的信息
  5. PAT乙级 1022. D进制的A+B (20)
  6. js中Number
  7. Cocos2d-x--开发参考资料
  8. 第二百五十天 how can I 坚持
  9. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)
  10. linux的命令使用记录
  11. Linux下的crontab
  12. 范性for语义以及pair和ipair的区别
  13. SQL Server中NULL的一个测试
  14. [LeetCode] Binary Trees With Factors 带因子的二叉树
  15. python之路:列表及元组之定义
  16. hue报错StructuredException: timed out (code THRIFTSOCKET): None的处理
  17. [BJWC2011]最小三角形(分治+最近点对)
  18. 【Java】 剑指offer(48) 最长不含重复字符的子字符串
  19. linux 关闭笔记本自带键盘
  20. 关于oracle分组排序取值的问题

热门文章

  1. 分享知识-快乐自己:Shiro 退出登陆清空缓存实现
  2. 大数据_学习_01_Hadoop 2.x及hbase常用端口及查看方法
  3. Android DOM解析XML方法及优化
  4. NYOJ-小猴子下落
  5. linux命令学习(8):mv命令
  6. Maven(5)-优化和重构POM
  7. (转载)[机器学习] Coursera ML笔记 - 监督学习(Supervised Learning) - Representation
  8. BZOJ4010:[HNOI2015]菜肴制作
  9. tomcat如何修改发布目录
  10. eclipse如何集成tomcat插件