洛谷p1652 圆 C++练手题
来源:互联网 发布:九品网络电视安卓9ptv 编辑:程序博客网 时间:2024/06/06 07:53
题目描述
给出N个圆,保证任意两个圆都相离,然后给出两个点(x1,y1)、(x2,y2),保证均不在某个圆上,要从点(x1,y1)到(x2,y2)画条曲线,问这条曲线最少穿过多少次圆的边界?
输入输出格式
输入格式:第一行为一个整数N,表示圆的个数;
第二行是N个整数,表示N个圆的X坐标;
第三行是N个整数,表示N个圆的Y坐标;
第四行是N个整数,表示N个圆的半径R;
第五行是四个整数x1,y1,x2,y2.
【数据规模】
1≤N≤50,坐标范围[-1000,1000],每个圆的半径1<=R<=1000。
保证没有两个圆有公共点,起点和终点不会落到某个圆的边界上。
输出格式:仅一个整数,表示最少要穿过多少次圆的边界。
显然当一个圆仅覆盖一个点时必然会经过圆的边界。。。
贴上蒟蒻代码。
#include<cstdio>
#include<cmath>
using namespace std;
int t1,t2,sum,n,x1,x2,yy,y2,x[51],y[51],r[51];
bool fuck(int z)
{
if ((sqrt(abs(x1-x[z])*abs(x1-x[z])+abs(yy-y[z])*abs(yy-y[z]))<r[z])) t1=1;
else t1=2;
if ((sqrt(abs(x2-x[z])*abs(x2-x[z])+abs(y2-y[z])*abs(y2-y[z]))<r[z])) t2=1;
else t2=2;
if (t1!=t2) return false;
return true;
}
int main()
{
sum=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&x[i]);
for (int i=1;i<=n;i++)
scanf("%d",&y[i]);
for (int i=1;i<=n;i++)
scanf("%d",&r[i]);
scanf("%d%d%d%d",&x1,&yy,&x2,&y2);
for (int i=1;i<=n;i++)
if (fuck(i)==false) sum++;
printf("%d",sum);
return 0;
}
- 洛谷p1652 圆 C++练手题
- c语言练手项目
- Codevs P1652 淘汰赛制
- 练手: 贪吃蛇(c++)
- 小程序练手(c++)
- 汇编的练手题
- 树套树练手题
- 算法题练手
- 练手
- 练手
- 练手~~~
- 练手
- C/C++练手-逆转链表
- C语言练手自己编写学生成绩管理系统
- C练手程序--1.位操作
- c语言练手——记录1
- 练手、练手
- C++新手题 练手题
- 最长回文串——Manacher模板
- 树莓派镜像备份与恢复文章
- 心迹
- vim调试器gdbmgr的安装介绍
- WM_SHOWWINDOW消息(详解)
- 洛谷p1652 圆 C++练手题
- X264阅读
- 第8章 系统的时域分析
- (16)内容浏览器界面
- SQL基础练习题
- elasticsearch demo详解
- vue-cli#2.0 webpack 配置分析
- 算法 归并排序
- c++的初始化问题