求助
  • 板块学术版
  • 楼主q1haoyu_QiQi
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/4/15 21:55
  • 上次更新2023/10/23 18:21:44
查看原帖
求助
728935
q1haoyu_QiQi楼主2023/4/15 21:55

计算几何初探

题目描述

本题是代码填空题,按要求补充给出代码的空白即可通过题目。

#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n, m;
struct Point{
    int x, y;
    double det(){
        return sqrt((double)x * x + y * y);
    }
    Point operator+(/*补全函数*/){
        /*补全函数*/
    }
} p[N];
Point operator-(/*补全函数*/){
    /*补全函数*/
}
/*
    补全其余未定义的函数
*/
int main() {
	scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d%d", &p[i].x, &p[i].y);
    for(int i = 1; i <= m; ++i){
        int op, r, s;
        scanf("%d%d", &op, &r);
        if(op != 1)
            scanf("%d", &s);
        if(op == 1){
            printf("%.2lf\n", p[r].det());
        }
        else if(op == 2){
            Point t = p[r] + p[s];
            printf("%d %d\n", t.x, t.y);
        }
        else if(op == 3){
            Point t = p[r] - p[s];
            printf("%d %d\n", t.x, t.y);
        }
        else if(op == 4){
            printf("%d\n", dot(p[r], p[s]));
        }
        else if(op == 5){
            printf("%d\n", cross(p[r], p[s]));
        }
        else if(op == 6){
            printf("%.2lf\n", dis(p[r], p[s]));
        }
    }
    
	return 0;
}

先输入 nn 和 mm,再输入 nn 个二维坐标(编号从 11 开始),接着输入 mm 个询问,对其中每个询问做出一个回答。 询问包括:

  • 1 r 求第 rr 个坐标对应的向量的模长(模长公式 xr2+yr2\sqrt{x_r^2+y_r^2})。
  • 2 r s 求第 rr 个坐标对应的向量和第 ss 个坐标对应的向量的加法结果(加法公式 (xr,yr)+(xs,ys)=(xr+xs,yr+ys)(x_r,y_r)+(x_s,y_s)=(x_r+x_s,y_r+y_s))。
  • 3 r s 求第 rr 个坐标对应的向量和第 ss 个坐标对应的向量的减法结果(减法公式 (xr,yr)−(xs,ys)=(xr−xs,yr−ys)(x_r,y_r)-(x_s,y_s)=(x_r-x_s,y_r-y_s))。
  • 4 r s 求第 rr 个坐标对应的向量和第 ss 个坐标对应的向量的点乘结果(点乘公式 (xr,yr)⋅(xs,ys)=xrxs+yrys(x_r,y_r) \cdot (x_s,y_s)=x_rx_s+y_r y_s)。
  • 5 r s 求第 rr 个坐标对应的向量和第 ss 个坐标对应的向量的叉乘结果(叉乘公式 (xr,yr)×(xs,ys)=xrys−yrxs(x_r,y_r) \times (x_s,y_s)=x_ry_s-y_rx_s)。
  • 6 r s 求点 rr 和点 ss 之间的距离(距离公式 (xr−xs)2+(yr−ys)2\sqrt{(x_r-x_s)^2+(y_r-y_s)^2})。

输入格式

从标准输入读入数据。 第一行输入两个正整数 n,mn,m(n,m≤100n,m\le 100)。 接下来 nn 行每行输入两个整数 x,yx,y(−1000≤x,y≤1000-1000\le x,y\le 1000),表示两个坐标。 接下来 mm 行每行输入一个询问,格式见题面。

输出格式

输出到标准输出。 对于每个询问,回答一行。 如果答案是一个数量,直接输出;如果答案是一个二维向量(或二维坐标),按先 xx 后 yy 的顺序输出该坐标。 对于第 11 类和第 66 类询问输出保留 22 位小数。

样例 #1

样例输入 #1

3 6
1 1
2 3
3 2
1 2
2 1 2
3 1 2
4 1 2
5 1 2
6 2 3

样例输出 #1

3.61
3 4
-1 -2
5
1
1.41

代码:



#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n, m;
struct Point{
    int x, y;
    double det(){
        return sqrt((double)x * x + y * y);
    }
    Point operator%(Point &b){
        return (Point){sqrt(b.x/2 + b.y/2)};
    }
} p[N];
Point operator^(Point &a,Point &b){
    return (Point){a.x + b.x,a.y + b.y};
}
Point dot(Point &a ,Point &b){
	return(Point) {a.x*b.x + a.y*b.y};
}
Point cross(Point &a,Point &b){
	return(Point) {abs(a.x*b.x - a.y*b.y)};
}
Point dis(Point &a,Point &b){
	return(Point){sqrt((double)pow(a.x-b.x,2)+ pow(a.y - b.y,2))};
}

int main() {
	scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d%d", &p[i].x, &p[i].y);
    for(int i = 1; i <= m; ++i){
        int op, r, s;
        scanf("%d%d", &op, &r);
        if(op != 1)
            scanf("%d", &s);
        if(op == 1){
            printf("%.2lf\n", p[r].det());
        }
        else if(op == 2){
            Point t = p[r] % p[s];
            printf("%d %d\n", t.x, t.y);
        }
        else if(op == 3){
            Point t = p[r] ^ p[s];
            printf("%d %d\n", t.x, t.y);
        }
        else if(op == 4){
            printf("%d\n", dot(p[r], p[s]));
        }
        else if(op == 5){
            printf("%d\n", cross(p[r], p[s]));
        }
        else if(op == 6){
            printf("%.2lf\n", dis(p[r], p[s]));
        }
    }
    
	return 0;
}
2023/4/15 21:55
加载中...