テンセント2018アンドロイド実習模擬ペン試験問題——魔法陣


本当に自分のデータ構造とアルゴリズムが弱すぎて、多くのstl容器が使えないと思って、本当に練習が少なすぎて熟練していません!

に言及


できたばかりで、問題が見つからないので、ざっと話してください.
4つの点が与えられ、正方形出力Yesを構成することができ、そうでなければ出力Noを構成することができる.1つの数nを入力すると、テストサンプルの数を表す2 n行が続き、2行ごとに1つのテストサンプルの2行目の1行目に4つの数字があり、それぞれ4つの点に対応する座標x 2行目にも4つの数字があり、それぞれ4つの点の座標yに対応する

入力


3 0 0 2 2 0 2 0 2 0 1 5 6 1 6 0 5 0 0 7 7 0 3 0 3

しゅつりょく


Yes Yes No

構想


最初はこのような例の入力を見て、すべての例が1番目の座標が左上角、2番目の座標が右上角、3番目が左下角などであると考え、投機的に巧みに①を判断し、対角線の長さが等しいと判断した.②、2本の隣接辺の長さが等しい.このようにして、コードを提出した後、テストサンプルが10%しか通過していないのを見て、心が冷たくなった.点がどの位置に対応するかがランダムである以上、①ですべての点間の距離を計算することができ、結果は2つの値(すなわち隣接辺長と対角線長)しかありませんが、これには問題があります.この条件でも等辺三角形と中心点が満たされています(実は私たちが入力した座標値はすべて整数なので、このような状況が発生するかどうか分かりませんが、等辺三角形の中心点と角点は必ずルート番号が付いているような気がしますが、ここでは判断したほうがいいです)ので、もう1つの②、2つの値の比は必ず1:√2と判断し、これらの点間の距離は1つの容器で格納することができます.保存済み容器のsizeが2でなければ、必ず条件①を満たさず、Noを出力し、そうでなければ比関係を判断する.△しかし、容器を選ぶとき、setでこんなに役に立つのを忘れて調べてくれた以上、私は本当に愚かで、STLを補充しなければなりません...

コード#コード#

# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include

using namespace std;

int main(void) {
    int a[4][2];
    int n;
    cin >> n;
    while (n--) {
        //   
        for (int i=0; i<4; i++) {
            cin >> a[i][0];
        }
        for (int i=0; i<4; i++) {
            cin >> a[i][1];
        }
        //   
        set<float> qq;
        for (int i = 0; i < 4; i++) {
            for (int j = i+1; j < 4; j++) {
                float tmp = sqrt(pow((a[i][0]-a[j][0]),2)+pow((a[i][1]-a[j][1]),2));
                qq.insert(tmp); 
            }
        }
        //   
        if (qq.size() != 2) {
            cout << "No" << endl;
        } else {
            //   
            float haha[2];
            int py = 0;
            for (set<float>::iterator it = qq.begin(); it!= qq.end(); it++) {
                haha[py] = *it;
                py++;
            }
            //   
            if ((fabs((haha[0]*sqrt(2))-haha[1]) < 0.0001) || (fabs((haha[1]*sqrt(2))-haha[0]) < 0.0001)) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        }
    }
    return 0;
}