求bug…蚂蚁爬过的整点

ccnyou ccnyou 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
求Bug。。。蚂蚁爬过的整点
Time Limit:1000MS Memory Limit:65535K
题型: 编程题 语言: 无限制

描述
一蚂蚁在地图上爬过,小明在地图上建个坐标,将蚂蚁留下的痕迹分成多条线段首位相连而成,
且那些线段的端点都是整数点,现在他想知道这只蚂蚁经过了坐标中多少个整数点。

输入格式

第一行输入一个整数t,表示case数;对于每个case,第一行输入一个整数n(0<=n<=10),代表蚂蚁经过的线段的数量,
接下来n+1行,每行有两个整数x,y(-10000<=x,y<=10000),表示蚂蚁依次经过线段的端点。

输出格式
每个case输出一行,蚂蚁所经过的整数点数量。
输入样例

1
3
0 0
0 4
2 2
2 0
输出样例
9

我的代码是错误,但是我找不到错误输入。。。
试过级组数据,木有办法。。。交了几次都是错误。。。


#include <stdio.h>
#include <stdlib.h>

typedef struct
{
int x,y;
}POINT;

//#define DEBUG

#ifdef DEBUG
#define MAX_CNT 100
#else
#define MAX_CNT 10000
#endif

//这是端点数组
POINT g_Point[MAX_CNT];

//这里记录经过的整点的坐标
//因为最多10组数据,每组最多10000*2+1 = 20001,乘上10 = 200010 < 210000
POINT g_PointOK[21*MAX_CNT];
int g_iPointOKCnt = 0;

inline int Min(int a,int b)
{
return a>b?b:a;
}

inline int Max(int a,int b)
{
return a>b?a:b;
}

int PointCmp(const void *a,const void *b)
{
//排序用,相同返回0
const POINT *pa,*pb;
pa = (const POINT *)a;
pb = (const POINT *)b;
if (pa->x != pb->x)
{
return pa->x - pb->x;
}
return pa->y - pb->y;
}


int GetPointCnt(POINT PointA,POINT PointB)
{
//计算 PointA 到 PointB 中有多少个整数点
int iRet = 0;
//△x,△y,
int dx = abs(PointA.x-PointB.x);
int dy = abs(PointA.y-PointB.y);
int i = 0;

//横坐标相同
if (PointA.x == PointB.x)
{
POINT tmp;
tmp.x = PointA.x;
for (i = 0;i < dy + 1;i++)
{
//找到整点,存进记录数组
tmp.y = i+Min(PointA.y,PointB.y);
g_PointOK[g_iPointOKCnt++] = tmp;
}
return dy + 1;
}

//start为左边点
POINT Start,End;
if (PointA.x < PointB.x)
{
Start = PointA;
End = PointB;
}
else
{
Start = PointB;
End = PointA;
}

//tdx tdy是整点距始点的距离(带符号)
int tdx = 0;
int tdy = 0;
for (i = Start.x+1 ; i<=End.x ; i++)
{
tdx = i - Start.x;
tdy = tdx * (End.y - Start.y) / dx;
if (tdx*dy%dx == 0)
{
//找到第一个整点
break;
}
}

//这条线段整点个数
iRet = dx / tdx + 1;

//把所有整点存进记录数组
POINT tmp;
for (i = 0;i < iRet;i++)
{
tmp.x = Start.x + i*tdx;
tmp.y = Start.y + i*tdy;
g_PointOK[g_iPointOKCnt++] = tmp;
}

return iRet;
}

int main()
{
int iCase = 0,i = 0,j = 0;
int iLineCnt = 0;
int iPointCnt = 0;
scanf("%d",&iCase);
while (iCase-- >0)
{
iPointCnt = 1;
g_iPointOKCnt = 0;
scanf("%d",&iLineCnt);
for (i = 0;i <= iLineCnt;i++)
{
scanf("%d%d",&g_Point[i].x,&g_Point[i].y);
if (i >= 1)
{
GetPointCnt(g_Point[i-1],g_Point[i]);
}
}
//先排序,然后看有多少个不同的
qsort(g_PointOK,g_iPointOKCnt,sizeof(POINT),PointCmp);
for (i = 1;i < g_iPointOKCnt;i++)
{
if (PointCmp(&g_PointOK[i-1],&g_PointOK[i]) != 0)
{
iPointCnt++;
}
}
printf("%d\n",iPointCnt);
}


return 0;
}

...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
ccnyou
C语言 70,039 成员 243,237 内容