在一个XY坐标系中有一些点,横坐标为x、纵坐标为y。请你来判断,这些点是否在该坐标系中属于同一条直线上,是则输出true,否则请输出false。
测试样例
输入
6 1 1 2 2 3 4 4 5 5 6 7 7
输出
false
利用长度可变的动态二维数组//如 申请了m*n个int型的存储单元,并用int型指针变量p指向这段内存的首地址,尽管它相当于建立了一个m行n列的二维动态数组,但不能用p[][]来表示,只能使用*(p+i*n+j)或p[ i*n+j]来表示数组值
int main()
{
int n,i=0,m=0;
scanf("%d",&m);
int flag=1;
int*arr=NULL;
arr=(int*)malloc(sizeof(int)*2*m);
for (n=0;n<m;n++)//i是列数 第一列存X,第二列存y
{
for (i=0;i<2;i++)
{
scanf("%d",&arr[i*m+n]);//先访问第一个单元存储X1,再访问第m+1个单元存储y1,形成一对坐标
//再第二个单元x2,第m+2个单元y2 ,注意数组从0开始编号,所以编号是个数减一
}
int k1=0,k2=0,k3=0,k4=0;
for (i=0;i<m-2;i++)
{
k1=arr[m+i+1]-arr[m+i];//k1=y2-y1,y是在第二行 所以y1前面就有m个存储单元 编号从0~m-1,所以yi=arr[m+i]
k2=arr[i+1]-arr[i];//k2=x2-x1
k3=arr[m+i+2]-arr[m+i+1];//k3=y3-y2
k4=arr[i+2]-arr[i+1];//l4=x3-x2
if(k1*k4!=k2*k3)
{
flag=0;
break;
}
}
if(flag)printf("true");
else printf("false");
free(arr);
arr=NULL;
return 0;
}