|
思路: 每个石头可以分为两个波,一个高峰波,一个低谷波。 每个波可以分为很多个水平方向的波。 每个水平方向的波有三种情况,起始点的位置: 1. 位于 B1 左边 2. 位于 B1,B2 中间 3. 位于 B2 右边 其中第2种情况有点麻烦,多次往返的话要一次算完。 代码:
#include <stdio.h>
#include <string.h>

int P, B1, B2, R, back_dis, map[16][16];

#define inline

inline int min(int a, int b)
  {
return a < b ? a : b;
}

inline int abs(int a)
  {
return a > 0 ? a : -a;
}

inline void put(int x, int y, int h)
  {
if (x < -4 || x > 4 || y < -4 || y > 4)
return ;
map[y + 4][x + 4] += h;
}

inline void left(int x, int y, int t, int h, int dir)
  {
int i;

 if (!dir) {
// left
x -= t;
 } else {
// right
i = min(t, B1 - x - 1);
t -= i;
x += i;
 if (t > 1) {
t--;
x -= t;
}
}
put(x, y, h);
}

inline void right(int x, int y, int t, int h, int dir)
  {
int i;

 if (!dir) {
// left
i = min(t, x - B2 - 1);
t -= i;
x -= i;
 if (t > 1) {
t--;
x += t;
}
 } else {
// right
x += t;
}
put(x, y, h);
}

inline void mid(int x, int y, int t, int h, int dir)
  {
int i;

 if (!dir) {
// left
i = min(t, x - B1 - 1);
t -= i;
x -= i;
 } else {
// right
i = min(t, B2 - x - 1);
t -= i;
x += i;
}
 if (t > 1) {
i = t / back_dis;
if (i)
t -= i*back_dis;
}
 if (!t) {
put(x, y, h);
return ;
}

t--;
mid(x, y, t, h, !dir);
}

inline void point(int x, int y, int t, int h, int dir)
  {
if (x < B1)
left(x, y, t, h, dir);
else if (x > B1 && x < B2)
mid(x, y, t, h, dir);
else
right(x, y, t, h, dir);
}

inline void pair(int x, int y, int t, int h)
  {
if (t > R)
return ;
if (t == R)
put(x, y, h);
 else {
point(x, y, R - t, h, 0);
point(x, y, R - t, h, 1);
}
}

inline void wave(int x, int y, int t, int h)
  {
int i;

for (i = -4; i <= 4; i++)
pair(x, i, t + abs(y - i), h);
}

int main()
  {
int i, x, y, t;

freopen("e:\\test\\in.txt", "r", stdin);

scanf("%d%d%d%d", &P, &B1, &B2, &R);
 if (B1 > B2) {
i = B2;
B2 = B1;
B1 = i;
}
back_dis = 2*(B2 - B1) - 2;
 while (P--) {
scanf("%d%d%d", &x, &y, &t);
wave(x, y, t, 1);
wave(x, y, t + 2, -1);
}

 for (y = 4; y >= -4; y--) {
 for (x = -4; x <= 4; x++) {
 if (x == B1 || x == B2) {
putc('X', stdout);
continue;
}
i = map[y + 4][x + 4];
if (i > 0)
putc('*', stdout);
else if (i < 0)
putc('o', stdout);
else
putc('-', stdout);
}
putc('\n', stdout);
}

return 0;
}

|