字节跳动06月20号 ES部门笔试
字节跳动06月20号 ES部门笔试 第五题猜数游戏: n个棋子(相当于n个坐标点) 是否存在x=a 或者 y=b直线 使所有的坐标点位于这俩直线上(满足一条直线就行)
用的回溯法 , 笔试时候AC80%
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//判断这个a b值是否满足条件1
bool is_valid(int a,int b,vector<vector<int> > &points)
{
int n = points.size();
for(int i=0;i<n;i++)
{
if(points[i][0]!=a && points[i][1]!=b)
{
return false;
}
}
return true;
}
//回溯 递归
void helper(int x,int y,vector<vector<int> > &res,int &n,vector<vector<int> > &points)
{
if(x>=n || y>=n)
{
return;
}
if(is_valid(points[x][0],points[y][1],points))
{
vector<int> temp0;
temp0.push_back(points[x][0]);
temp0.push_back(points[y][1]);
res.push_back(temp0);
helper(x,y+1,res,n,points);
//return;
}
else
{
helper(x,y+1,res,n,points);
}
return;
}
// 对满足条件的 a b 进行排序 选出 a*1000+b最小的
bool cmp(const vector<int>& a,const vector<int>& b)
{
return a[2] < b[2];
}
int main()
{
int n;
cin>>n;
vector<vector<int> >points(n,vector<int>(2,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<2;j++)
{
cin>>points[i][j];
if (cin.peek() == ',')
{
cin.get();
}
if (cin.peek() == '\n')
{
break;
}
}
}
vector<vector<int> > res;
for(int i=0;i<n;i++)
{
helper(i,0,res,n,points);
}
if(res.empty())
{
cout<<-1<<','<<" "<< -1<<endl;
return 0;
}
for(int i=0;i<res.size();i++)
{
int min_val = res[i][0]*1000+res[i][1];
res[i].push_back(min_val);
}
sort(res.begin(),res.end(),cmp);
cout<<res[0][0]<<','<<" "<<res[0][1]<<endl;
return 0;
}