谷歌翻译
布法罗·比尔(Buffalo Bill)希望跨越1000x1000平方英寸的字段。 场上的不同位置上有许多蛇,每条蛇可以在任何方向上撞击特定的距离。 比尔能不被咬住而旅行吗? 假定该字段的西南角在(0,0),西北角在(0,1000)。 输入由包含n <= 1000(蛇的数量)的行组成。 每条蛇都有一条直线,其中包含三个实数:蛇的(x,y)位置及其触击距离。 蛇会咬任何比其位置更近的东西。 比尔必须进入西南和西北角之间的区域,并且必须离开东南和东北角之间的区域。 如果比尔可以完成这次旅行,请给出他可以进入和离开该字段的坐标。 如果比尔可能在几个地方进出,请向北偏北。 如果没有这样的位置,则打印“比尔将被咬”。
大意:就是说一个人从西边过来,到东北去,途中有蛇,回攻击以它为圆心的范围的人,给出几条蛇位置和攻击范围,问人可以过去吗,如果能就打出人最后进入和 离开偏北的位置,若不能就到出 Bill will be bitten.
拿到题第一个想法是用二维数组表示地图,
考虑过不去,就是蛇的圈香蕉,把上下连接起来,用dfs来判断是否封路,把不能去的范围标记(用dfs)
找最出去点的话,就是在输入蛇时把与上界香蕉,且与右边香蕉的点找到(dfs)就是出去点
找进入同上
于是想利用 dfs
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
shuru(x+bu[i][0],y+bu[i][1],o);
}
}
else return;
}//
int rux=0,ruy=999,chux=999,chuy=999;int p1,p2,p3,p4;
void pan(int x,int y,int o,int p1,int p2,int p3,int p4 ){
if(a[x][y]0&&x>=1000&&x<0&&y>=1000&&y<0){
return;
}
a[x][y]=0;
//上不通 p1 下不通 p2 左不通 p3 右不通 p4
// 判断3种情况 上下不通 上左不通 上右不通
if(x0) p3=1;
if(y0) p2=1;
if(x999) p4=1;
if(y999) p1=1;
if(p11&&p21){
cout<<“Bill enters at (”<<rux <<", “<<ruy <<”) and leaves at ("<<chux <<", “<<chuy<<”).";
exit(0);
}
if(p11&&p31){//更新值
ruy=max(ruy,y);
}
if(p11&&p4==1){
chuy=max(chuy,y);
}
for(int i=0;i<4;i++){
pan(x+bu[i][0],y+bu[i][1],o,p1,p2,p3,p4);
}
}
int main(){
cin>>n;
int s[10];int x,y,o;
for(int i=0;i<n;i++){//shuru 蛇
cin>>x>>y>>o;
x-=1;y-=1;
ji[i][0]=x;ji[i][1]=y;
jx=x,jy=y;
shuru(x,y,o);
cout<<nj;
}
for(int i=0;i<n;i++){
pan(ji[i][0],ji[i][1],o,0,0,0,0);
}
cout<<"Bill enters at ("<<rux <<", "<<ruy <<") and leaves at ("<<chux <<", "<<chuy<<").";
}
但是很遗憾,因为递归 调用空间太大了 不得行
我哭了,写这么就,不行,使用说算法设计很重要啊,写之前一定要考虑算法的可行性
标记明显不可能,那么就不标记直接在寻路时判断 但是不标记,不好判断。。。
可是,时间太晚了,我要睡觉了。。。 思路大概有了
如果要代码可以去参考https://blog.csdn.net/icefox_zhx/article/details/77837085
我太菜了 不行了 8