CF-48E. Ivan the Fool VS Gorynych the Dragon(bfs+dfs+判重回路)

本文介绍了一个关于Ivan与Gorynych the Dragon战斗的算法问题。Ivan通过最优策略使用魔法剑削减龙的头和尾巴,而龙则能生长新的头和尾巴。任务是编写程序来确定战斗结果:Ivan获胜、平局或是龙获胜。

E. Ivan the Fool VS Gorynych the Dragon
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Once upon a time in a kingdom far, far away… Okay, let’s start at the point where Ivan the Fool met Gorynych the Dragon. Ivan took out his magic sword and the battle began. First Gorynych had h heads and t tails. With each strike of the sword Ivan can either cut off several heads (from 1 to n, but not more than Gorynych has at the moment), or several tails (from 1 to m, but not more than Gorynych has at the moment). At the same time, horrible though it seems, Gorynych the Dragon can also grow new heads and tails. And the number of growing heads and tails is determined uniquely by the number of heads or tails cut by the current strike. When the total number of heads and tails exceeds R, Gorynych the Dragon strikes its final blow and destroys Ivan the Fool. That’s why Ivan aims to cut off all the dragon’s heads and tails as quickly as possible and win. The events can also develop in a third way: neither of the opponents can win over the other one and they will continue fighting forever.

The tale goes like this; easy to say, hard to do. Your task is to write a program that will determine the battle’s outcome. Consider that Ivan strikes consecutively. After each blow Gorynych grows a number of new heads and tails depending on the number of cut ones. Gorynych the Dragon is defeated if after the blow he loses all his heads and tails and can’t grow new ones. Ivan fights in the optimal way (fools are lucky), i.e.

  • if Ivan can win, he wins having struck the least number of blows;
  • if it is impossible to defeat Gorynych, but is possible to resist him for an infinitely long period of time, then that’s the strategy Ivan chooses;
  • if Gorynych wins in any case, Ivan aims to resist him for as long as possible.

Input

The first line contains three integers ht and R (0 ≤ h, t, R ≤ 2000 < h + t ≤ R) which represent the initial numbers of Gorynych’s heads and tails and the largest total number of heads and tails with which Gorynych the Dragon does not yet attack. The next line contains integer n (1 ≤ n ≤ 200). The next n contain pairs of non-negative numbers "hi ti" which represent the number of heads and the number of tails correspondingly, that will grow if Gorynych has i heads (1 ≤ i ≤ n) cut. The next line contains an integer m (1 ≤ m ≤ 200) and then — the description of Gorynych’s behavior when his tails are cut off in the format identical to the one described above. All the numbers in the input file do not exceed 200.

Output

Print "Ivan" (without quotes) in the first line if Ivan wins, or "Zmey" (that means a dragon in Russian) if Gorynych the Dragon wins. In the second line print a single integer which represents the number of blows Ivan makes. If the battle will continue forever, print in the first line "Draw".

Sample test(s)
input
2 2 4
2
1 0
0 1
3
0 1
0 1
0 0
output
Ivan
2
input
2 2 4
1
0 1
1
1 0
output
Draw
input
2 2 5
1
1 1
1
3 0
output
Zmey
2

思路:本题数据最多就两百,因此可以使用广搜出猎人斩龙的最佳路数,如果猎人无法斩龙,那就深搜判断是否组成回路,从而形成永久的对战模式,还是不行那就更新猎人最终成为龙的食物的最大路数。


#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int mm=250;
const int oo=1e9;
int vis[mm][mm];
bool yes;
int h,t,r,n,m;
class node
{
  public:int h,t,c;
}hh[mm],tt[mm];
queue<node >q,p;
int dfs(int x,int y)
{ int&ret=vis[x][y];
  int tx,ty;
  if(x+y>r)return 0;
  if(vis[x][y]==-2)
  {
    yes=1;return 0;
  }
  else if(vis[x][y]==-1)
  {
    ret=-2;int dd=-oo,z;
    int bbs;
    bbs=n<x?n:x;
    for(int i=0;i<bbs;i++)
      {
        tx=x+hh[i].h-i-1;ty=y+hh[i].t;
        z=dfs(tx,ty)+1;
        dd=dd>z?dd:z;
      }
      bbs=m<y?m:y;
      for(int i=0;i<bbs;i++)
      {
        tx=x+tt[i].h;ty=y+tt[i].t-i-1;
        z=dfs(tx,ty)+1;
        dd=dd>z?dd:z;
      }
      ret=dd;
  }
  return ret;
}
int main()
{
  while(cin>>h>>t>>r)
  {
    cin>>n;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    {
      cin>>hh[i].h>>hh[i].t;
    }
    cin>>m;
    for(int j=0;j<m;j++)
    {
      cin>>tt[j].h>>tt[j].t;
    }
    vis[h][t]=1;
     int x,y,zz;
     while(!q.empty())q.pop();
     node z,p;yes=0;
     z.h=h;z.t=t;z.c=0;
     q.push(z);
     while(!q.empty()&&!yes)
     { z=q.front();q.pop();
      int bbs=n<z.h?n:z.h;
      for(int j=0;j<bbs;j++)
      {
        x=z.h+hh[j].h-j-1;y=z.t+hh[j].t;
        if(x+y>r)continue;
        if(!vis[x][y])
        {vis[x][y]=1;
         p.h=x;p.t=y;p.c=z.c+1;
         if(x==0&&y==0)
          { cout<<"Ivan\n"<<p.c<<"\n";yes=1;
            break;
          }
         ///if(x+y>r&&d>z.c){d=z.c;continue;}
         q.push(p);
        }
      }
      bbs=m<z.t?m:z.t;
      for(int j=0;j<bbs;j++)
      {
        x=z.h+tt[j].h;y=z.t+tt[j].t-j-1;
        if(x+y>r)continue;
        if(!vis[x][y])
        {vis[x][y]=1;
         p.h=x;p.t=y;p.c=z.c+1;
         if(x==0&&y==0)
          { cout<<"Ivan\n"<<p.c<<"\n";yes=1;
            break;
          }
         ///if(x+y>r&&d>z.c){d=z.c;continue;}
         q.push(p);
        }
      }
    }
    if(yes)continue;
    memset(vis,-1,sizeof(vis));
    int ans=dfs(h,t);
    if(yes)cout<<"Draw\n";
    else cout<<"Zmey\n"<<ans<<"\n";
  }
}



`js/chunk-vendors.46c48e48.js` 文件通常是一个现代前端构建工具(如 Webpack 或 Rollup)生成的依赖库或组件的动态加载文件的一部分。这个文件包含了外部 JavaScript 库和模块,它们对于您的应用运行至关要。 `Terser Error: error:0308010C:digital envelope routines::unsupported` 这种错误信息是由压缩工具(通常是 `terser`,一种用于压缩和转换 JS 和 CSS 的工具)产生的。错误表明在尝试处理某个特定资源时遇到了不支持的数字信封功能(digital envelope routines)。这意味着你的构建过程中存在一些与加密相关的兼容性问题,这可能是由以下几个因素导致: 1. **版本冲突**:可能涉及到使用的某些依赖库版本与 `terser` 版本不兼容,特别是涉及到加密处理的部分。 2. **构建配置错误**:构建过程中的设置可能导致了此错误,例如配置了不应该对某些类型的文件进行压缩或优化。 3. **依赖问题**:某个依赖库内部可能使用了一些在当前环境中无法解析或不支持的功能,尤其是在涉及到数字信封、TLS/SSL 等加密操作时。 解决此类错误的一般步骤包括: - **更新或回滚构建工具及依赖**:首先检查并升级 `terser` 到最新版本或将其回退到已知稳定的版本。同样地,审查所有项目依赖,尤其是那些与加密或安全功能有关的依赖项。 - **审查构建配置**:查看 `.webpack.config.js` 或其他构建配置文件,确保没有意外地将某些资源排除出压缩流程,或是在压缩选项中设置不当。特别注意 `optimization.splitChunks.maxSizeLimit` 参数等可能影响到分块合并逻辑的配置项。 - **隔离受影响的库**:尝试逐个分离依赖库,找出导致错误的具体库及其版本。这可能需要在本地环境或单独的测试部署中逐一试验。 - **检查源码**:如果以上步骤都无法解决问题,深入查看引发错误的库源码,寻找是否可以找到更详细的错误日志或指示错误原因的信息。 针对这个问题,这里有几个可能的相关问题: 1. **如何避免在生产环境中遇到这种错误?** 2. **如何排查和解决构建过程中的依赖冲突问题?** 3. **在前端项目中遇到未知错误时,应该从哪一步开始调试?**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值