网易雷火笔试—三角形朝向题目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;
} 
联想公司福利 1548人发布