题解:
按照时间枚举一下那些点有水
然后用物理方案来计算
代码:
#include<bits/stdc++.h> const int N=25,M=110; int n,m,x,y,z,i,A,B,T,g[N],v[M],w[M],nxt[M],ed; struct P { int x,y,h,v; }a[N]; int getid(int x) { for (int i=1;i<=n;i++) if (a[i].x==x)return i; } void add(int x,int y,int z) { v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed; v[++ed]=x;w[ed]=z;nxt[ed]=g[y];g[y]=ed; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h); a[i].h+=a[i].y; a[i].v=i==1; } scanf("%d",&m); while (m--) { scanf("%d%d%d",&x,&y,&z); add(getid(x-1),getid(x+z),y); } scanf("%d%d",&A,&B); while (1) { for (x=1;x;) for (x=0,i=1;i<=n;i++) if (a[i].v) for (int j=g[i];j;j=nxt[j]) if (a[i].h<=w[j]&&!a[v[j]].v)a[v[j]].v=x=1; for (m=0,i=1;i<=n;i++) if (a[i].v&&a[i].h>m)m=a[i].h; if (a[A].v&&m==B) { printf("%d",T); return 0; } for (int i=1;i<=n;i++) if (a[i].v&&a[i].y==a[i].h&&a[i].y==m) { puts("-1"); return 0; } for (int i=1;i<=n;i++) if (a[i].v&&a[i].h==m)a[i].h--,T++; } }