题目:
对于坐标图中NxN的矩阵图中,每个节点都站着一个人,从(0,0)点往人群中看,有些人能被看到,有些人会被同一直线上的其他人挡住。问对于给定的N,能看到多少人?
其实相当于计算从原点到整个矩阵的点中一共有多少种斜率,但是无法使用集合等容器,所以遍历斜率的复杂度太高。之后和同学讨论,发现一种挺巧妙的方法:对于那些被前面的人挡住的点来说,他的坐标是可以通过约分来得到该点到原点的直线上离原点最近的那个人的坐标的,也就是说,当每个点的x,y坐标都约到互质时,这个点就是挡住后面人的第一个人,所以也就可以转化为遍历每个点,当该点的坐标已经互质时,则计数加一,如果存在公约数,则可以忽略,因为他一定被挡住了。
//检查该节点坐标是否可以约分
bool CheckReduce(int a, int b){
int minone = a>b?b:a;
for(int i=2;i<=minone;i++){
if((a%i)==0&&(b%i)==0)
return true;
}
return false;
}
//由于矩阵关于原点是对称的,所以只需要计算一个三角形。
int FindStar(int N){
int countN = 0;
for(int i;i<=N;i++){
if(i==0){
countN++;
continue;
}
for(int j=i+1;j<=N;j++){
if(!CheckReduce(i,j)){
countN++;
}
}
}
return countN*2+1;