首页 > 网易雷火笔试—三角形朝向题目AC代码
头像
森林小狼
编辑于 2019-09-16 11:10
+ 关注

网易雷火笔试—三角形朝向题目AC代码

如题。。。。。。。。。。。。。。。。。。。。。
//
// Created by max on 19-9-15.
//
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

struct  Tri
{
    int a;
    int b;
    int c;
    bool isRight = false;
};


void changeOrder(Tri &t)  //调整正反顺序 abc -> cba
{
    int a = t.a;
    int b = t.b;
    int c = t.c;
    t.a = c;
    t.b = b;
    t.c = a;
}

void changeOrder_min(Tri &t)  //调整为以最小开头
{
    int a = t.a;
    int b = t.b;
    int c = t.c;

    int minE;
    if(a < b)
        minE = a;
    else
        minE = b;
    if(c < minE)
        minE = c;

    if(minE == a)
        return;  //不需要调整

    if(minE == b)
    {
        t.a = b;
        t.b = c;
        t.c = a;
        return;
    }

    if(minE == c)
    {
        t.a = c;
        t.b = a;
        t.c = b;
        return;
    }

}


bool isLink ( Tri ti, Tri tj)  //a是目标 b是参考
{
    int cnt=0;
    int ai = ti.a, bi = ti.b, ci = ti.c;
    int aj = tj.a, bj = tj.b, cj = tj.c;

    if(ai == aj || ai == bj || ai == cj)
        cnt++;
    if(bi == aj || bi == bj || bi == cj)
        cnt++;
    if(ci == aj || ci == bj || ci == cj)
        cnt++;

    if(cnt == 2)
        return true;
    else
        return false;
}


bool isOrderRight(Tri ti, Tri tj)  //ti是否与tj一致
{
    int ai = ti.a, bi = ti.b, ci = ti.c;
    int aj = tj.a, bj = tj.b, cj = tj.c;

    bool flag=true;
    if(ai==aj && bi==bj || ai==bj && bi==cj || ai==cj && bi==aj)
        flag = false;
    if(bi==aj && ci==bj || bi==bj && ci==cj || bi==cj && ci==aj)
        flag = false;
    if(ci==aj && ai==bj || ci==bj && ai==cj || ci==cj && ai==aj)
        flag = false;

    return flag;
}

bool isNotFinal(vector<Tri>& v)
{

    for(int i=0; i<v.size(); i++)
    {
        if(v[i].isRight == false)
            return true;
    }

    return false;
}

int main()
{
    int N, M;
    cin  >> N >> M;

    vector<Tri> vec(M);
    for(int i=0; i<M; ++i)
    {
        cin >> vec[i].a >> vec[i].b >> vec[i].c;
    }

    changeOrder_min(vec[0]);
    vec[0].isRight = true;

    while( isNotFinal(vec) )
    {
        for(int i=1; i<M; ++i)
        {
            Tri t = vec[i];
            bool needChange = false;

            for(int j=0; j<i; ++j)  //遍历之前已排序的的三角形
            {
                if(vec[j].isRight == false)
                    continue;

                if( isLink(vec[i], vec[j]))  // i三角形 与之前的j三角形相连 且j是校正的
                {
                    if( isOrderRight(vec[i], vec[j]) ) //i三角形顺序对
                    {
                        changeOrder_min(vec[i]);  //只需调整最小即可
                        vec[i].isRight = true;
                        break;
                    }
                    else
                    {
                        changeOrder(vec[i]);
                        changeOrder_min(vec[i]);
                        vec[i].isRight = true;
                        break;
                    }
                }

            }

        }


        //再遍历一遍 有些没有调整
        for(int i=1; i<M; ++i)
        {
            if(vec[i].isRight == true)
                continue;

            Tri t = vec[i];

            for(int j=i+1; j<M; ++j)  //遍历之前已排序的的三角形
            {
                if(vec[j].isRight == false)
                    continue;

                if( isLink(vec[i], vec[j]))  // i三角形 与之前的j三角形相连 且j是校正的
                {
                    if( isOrderRight(vec[i], vec[j]) ) //i三角形顺序对
                    {
                        changeOrder_min(vec[i]);  //只需调整最小即可
                        vec[i].isRight = true;
                        break;
                    }
                    else
                    {
                        changeOrder(vec[i]);
                        changeOrder_min(vec[i]);
                        vec[i].isRight = true;
                        break;
                    }
                }

            }
        }
    }


    for(int i=0; i<M; ++i)
    {
        cout << vec[i].a << ' ' << vec[i].b << ' ' << vec[i].c << ' ' << endl;
    }

    return 0;
}


全部评论

(1) 回帖
加载中...
话题 回帖