由于看到群里同學(xué)的做法和自己的不一樣,所以打算將自己的代碼也放出來。
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2073
思路:看到這道題,我的第一想法就是找到這些坐標(biāo)點(diǎn)的規(guī)律,我將圖片上的點(diǎn)的坐標(biāo)依次寫在了草稿紙上,有:
0 0
0 1
1 0
0 2
1 1
2 0
0 3
1 2
2 1
3 0
我們將其分層,有
第一層:0 0
第二層:0 1
1 0
第三層:0 2
1 1
2 0
第四層:0 3
1 2
2 1
3 0
通過觀察可以發(fā)現(xiàn),x和y有這樣一個規(guī)律:
for (i = 0; i <= 200; i++)
{
for (j = 0; j <= i; j++)
{
x[k++] = j;
y[z++] = i - j;
}
}
于是,就有了如下代碼:
#pragma warning(disable:4996)
#include<stdio.h>
#include<math.h>
int main()
{
int n, i, j,k=0,z=0;
int x1, y1, x2, y2;
int start, end;
int x[40000], y[40000];
double ans;
for (i = 0; i <= 200; i++)//由于題目說明輸入數(shù)據(jù)不會超過一百,那就把要求范圍內(nèi)的所有點(diǎn)都先求出來
{
for (j = 0; j <= i; j++)
{
x[k++] = j;
y[z++] = i - j;
}
}
scanf("%d", &n);
getchar();
while (n--)
{
ans = 0;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
getchar();
for (i = 0; i <= k; i++)
{
if (x1 == x[i] && y1 == y[i]) start = i;//找到開始的坐標(biāo)
if (x2 == x[i] && y2 == y[i]) end = i;//找到結(jié)束的坐標(biāo)
}
if (end < start)
{
end = end ^ start;
start = start ^ end;
end = end ^ start;
}
for (i = start+1; i <= end; i++)//計算總的折現(xiàn)長度
{
ans += sqrt(pow(x[i] - x[i - 1],2) + pow(y[i] - y[i - 1],2));
}
printf("%.3lf\n", ans);
}
return 0;
}