今日は、ウィンターキャンプでのトレーニング
に関するいくつかの質問を要約します。最初の質問の
分析(初等幾何学):
質問の意味によると、4つのポイントの入力座標に次のようなものがある可能性があることは簡単にわかります。 2点が繰り返されるので、どちらの2点が繰り返されるかを判断する必要があります。次に、平行四辺形であるため、単純な平面ジオメトリの知識に基づいて、平行四辺形の4つの頂点を反時計回りの順序でa、b、c、として設定します。 d、次にax -bx = dx-cx、ay-by = dy-cyであるため、4番目の点の座標を簡単に決定できます。
#include<iostream>
using namespace std;
typedef struct{
double x,y;
}point;
int main(){
point a,b,c,d,e;
while(~scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y)){
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
if(a.x==c.x&&a.y==c.y)swap(a,b);//第一种情况
if(a.x==d.x&&a.y==d.y){
//第二种情况
swap(a,b);
swap(c,d);
}
if(b.x==d.x&&b.y==d.y)swap(c,d);//第三种情况
e.x=a.x+d.x-c.x;//第四种,也是我们集中情况调整后的状态
e.y=a.y+d.y-c.y;
printf("%.3lf %.3lf\n",e.x,e.y);
}
return 0;
}
質問2(
基本幾何学)この質問では、共線でない3点の外接円の周囲長を見つけましょう。基本幾何学の知識によれば、外接円の直径は正弦の法則に従って求めることができます。 、およびによると彼らは、B、Cである三角形の三辺を設定し、三角形の任意の角の正弦値を決定することができる三角形の面積の式S = A B sin∠ab/ 2、及び再度、記載ヘレンの式s =√p*(pa)(pb)(pc)、p =(a + b + c)/ 2に、上記の式と組み合わせると、外接円の周囲長を解くことができます。
代码如下:
#include<stdio.h>
#include<math.h>
#define PI 3.141592653589793
double length(double x1,double y1,double x2,double y2){
double side;
side=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return side;
}
double triangle(double side1,double side2,double side3){
double p=(side1+side2+side3)/2;
double area=sqrt(p*(p-side1)*(p-side2)*(p-side3));
return area;
}
double diameter(double s,double a,double b,double c){
double diam;
diam=a*b*c/2/s;
return diam;
}
int main(){
double x1,y1,x2,y2,x3,y3,side1,side2,side3,s,d;
while((scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3))!=EOF){
side1=length(x1,y1,x2,y2);
side2=length(x1,y1,x3,y3);
side3=length(x2,y2,x3,y3);
s=triangle(side1,side2,side3);
d=diameter(s,side1,side2,side3);
printf("%.2lf\n",PI*d);
}
return 0;
}
3番目の質問は
この質問に対するものです。「[」と「]」の外観は出力文字列の文字の順序に影響するため、文字列全体の各要素を線形リンクリストに入れる場合は、ポインタを使用してください。問題を解決するには、次の1次元配列を使用して、リンクリスト内の次のポインタをシミュレートできます。つまり、next [0]は要素を格納せず、入力された最初の文字の次の文字は2番目の文字です。 [1] = 2など、配列を使用してポインタをシミュレートします。変数curを使用してカーソルの位置を示し、変数lastを使用して出力文字列の最後の位置を示すことができます。変数curの値は、次の文字の位置がカーソルの右側にあることを意味します。 '['に遭遇した場合、cur = 0に設定します。 ']'に遭遇した場合。次に、cur = last、
cur、lastを時間内に更新する必要があります。
#include<bits/stdc++.h>
using namespace std;
#define maxl 100905
int main(){
char s[maxl];
while(~scanf("%s",s+1)){
int Next[maxl]={
0};
int cur=0,last=0;
for(int i=1;s[i];i++){
if(s[i]=='[')cur=0;//光标去最前面
else if(s[i]==']')cur=last;//光标去最后面
else{
Next[i]=Next[cur];//链表插入操作
Next[cur]=i;
if(cur==last)last=i;//更新last
cur=i;//更新cur
}
}
for(int i=Next[0];i!=0;i=Next[i])//输出
if(s[i]!='['&&s[i]!=']')printf("%c",s[i]);
printf("\n");
}
return 0;
}