做到火大的题,还不知道为什么我wa,自己测试了多种情况都对,就是不知道还有什么情况没考虑.
#include<iostream>
#include<cstring>
using namespace std;
struct Pipe
{
int x,y;
int height;
};
struct Link
{
int l,r;
int y;
};
Pipe pi[21];
Link lin[51];
bool use[21];
int p,l,aim,aimhe,Time;
void fine(int maintar,int mainhe)
{
int tar,tar1,he,he1;
he=he1=mainhe;
tar=tar1=maintar;
for(int i=1;i<l;i++)
{
if(pi[tar].x==lin[i].r)
{//aim左边有管
for(int j=1;j<p;j++)
{//选左边的j管
if(pi[j].x+1==lin[i].l&&!use[j])
{//找到并且没有注水&&he<=lin[i].y
if(he<=lin[i].y)//目标在连接管之上
if(pi[j].y>he)// 满灌
{
Time+=pi[i].height;
}
else
{
Time+=pi[j].height-(he-pi[j].y);
}
else//之下
{
Time+=pi[j].height-(lin[i].y-pi[j].y);
he=lin[i].y;
}
use[j]=true;
fine(tar,mainhe);//一管多连情况
fine(j,mainhe);
tar=j;
i=1;
break;
}
}
}
}
for(int i=1;i<l;i++)
{
if(pi[tar1].x+1==lin[i].l)
{//aim右边有管
for(int j=1;j<p;j++)
{
if(pi[j].x==lin[i].r&&!use[j])
{//找到并且没有注水&&he1<=lin[i].y
if(he1<=lin[i].y)//目标在连接管之上
if(pi[j].y>he1)// 满灌
{
Time+=pi[i].height;
}
else
{
Time+=pi[j].height-(he1-pi[j].y);
}
else//之下
{
Time+=pi[j].height-(lin[i].y-pi[j].y);
he1=lin[i].y;
}
use[j]=true;
fine(tar,mainhe);
tar1=j;
fine(j,mainhe);
i=1;
break;
}
}
}
}
}
int main()
{
int icase;
cin>>icase;
while(icase--)
{
memset(use,0,sizeof(use));
p=1;
l=1;
Time=0;
int pipenum;
cin>>pipenum;
while(pipenum--)
{
cin>>pi[p].x>>pi[p].y>>pi[p].height;
p++;
}
int linknum;
cin>>linknum;
while(linknum--)
{
cin>>lin[l].l>>lin[l].y;
int temp;
cin>>temp;
temp+=lin[l].l;
lin[l].r=temp;
l++;
}
cin>>aim>>aimhe;
Time=pi[aim].height-(aimhe-pi[aim].y);
use[aim]=true;
if(pi[aim].y>aim||aim>(pi[aim].y+pi[aim].height))
cout<<"No Solution"<<endl;
else
fine(aim,aimhe);
if(use[1])
cout<<Time<<endl;
else
cout<<"No Solution"<<endl;
}
return 0;
}