Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17498 | Accepted: 4855 |
Description
Input
Output
Sample Input
4 5 825 6725 6244865
Sample Output
0 0 0.5 2
将走的每一步转换成坐标点,然后对坐标点用向量叉乘求面积,因为在网格中走,所以用整形存就行了
有个坑点是中间算总面积求和的ans要用long long不然会整形溢出
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> using namespace std; struct Point { int x, y; Point() {} Point(int x, int y) : x(x), y(y) {} }; typedef Point Vector; char ch[1000010]; Point p[1000010]; int Cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; } void Area() { p[0] = Point(0, 0); int t = 0; for (int i = 0; ch[i] != '5'; i++) { ++t; switch (ch[i]) { case '1': p[t] = Point(p[t - 1].x - 1, p[t - 1].y - 1); break; case '2': p[t] = Point(p[t - 1].x, p[t - 1].y - 1); break; case '3': p[t] = Point(p[t - 1].x + 1, p[t - 1].y - 1); break; case '4': p[t] = Point(p[t - 1].x - 1, p[t - 1].y); break; case '6': p[t] = Point(p[t - 1].x + 1, p[t - 1].y); break; case '7': p[t] = Point(p[t - 1].x - 1, p[t - 1].y + 1); break; case '8': p[t] = Point(p[t - 1].x, p[t - 1].y + 1); break; case '9': p[t] = Point(p[t - 1].x + 1, p[t - 1].y + 1); break; } } long long ans = 0; //要使用long long,不然溢出 for (int i = 0; i < t; i++) { ans += Cross(p[i], p[i + 1]); } ans = ans < 0 ? -ans : ans; ans % 2 == 0 ? printf("%I64d", ans / 2) : printf("%I64d.5", ans / 2); return; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%s", ch); int len = strlen(ch); if (len <= 3) printf("0"); else Area(); cout << endl; } return 0; }