// // 01: 3 random cases // 02: 500 random cases // 03: 100 parallel cases // 04: 100 parallel and on the same line // 05: some extreme cases // 06: 500 in which one or both does not move // 07: runs in parallel but separated only by radius #include #include #include #include using namespace std; random_device rd; default_random_engine e1(rd()); int rand_int(int low, int high) { uniform_int_distribution uniform_dist(low, high); return uniform_dist(e1); } const int MAX_MAG = 100; bool touch(int x1, int y1, int z1, int r1, int x2, int y2, int z2, int r2) { if (!(-MAX_MAG <= x1 && x1 <= MAX_MAG)) return false; if (!(-MAX_MAG <= y1 && y1 <= MAX_MAG)) return false; if (!(-MAX_MAG <= z1 && z1 <= MAX_MAG)) return false; if (!(-MAX_MAG <= x2 && x2 <= MAX_MAG)) return false; if (!(-MAX_MAG <= y2 && y2 <= MAX_MAG)) return false; if (!(-MAX_MAG <= z2 && z2 <= MAX_MAG)) return false; int dx = x1-x2, dy = y1-y2, dz = z1-z2; return (dx*dx + dy*dy + dz*dz <= (r1+r2)*(r1+r2) + 10); } void random_case() { int x1, y1, z1, r1, vx1, vy1, vz1; int x2, y2, z2, r2, vx2, vy2, vz2; do { x1 = rand_int(-MAX_MAG,MAX_MAG); y1 = rand_int(-MAX_MAG,MAX_MAG); z1 = rand_int(-MAX_MAG,MAX_MAG); r1 = rand_int(1,MAX_MAG/5); x2 = rand_int(-MAX_MAG,MAX_MAG); y2 = rand_int(-MAX_MAG,MAX_MAG); z2 = rand_int(-MAX_MAG,MAX_MAG); r2 = rand_int(1,MAX_MAG/5); int dir = rand_int(0,2); int sign = rand_int(0,1)*2-1; switch (dir) { case 0: x2 = sign*(r1+r2) + x1; z2 = z1 = 0; break; case 1: y2 = sign*(r1+r2) + y1; x1 = x2 = 0; break; case 2: z2 = sign*(r1+r2) + z1; y1 = y2 = 0; break; } vx1 = rand_int(-MAX_MAG/5,MAX_MAG/5); vy1 = rand_int(-MAX_MAG/5,MAX_MAG/5); vz1 = rand_int(-MAX_MAG/5,MAX_MAG/5); switch (dir) { case 0: vx1 = vz1 = 0; break; case 1: vx1 = vy1 = 0; break; case 2: vy1 = vz1 = 0; break; } /* vx2 = rand_int(-MAX_MAG/5,MAX_MAG/5); vy2 = rand_int(-MAX_MAG/5,MAX_MAG/5); vz2 = rand_int(-MAX_MAG/5,MAX_MAG/5); */ int hi = min(min(100 / (vx1 ? abs(vx1) : 1), 100 / (vy1 ? abs(vy1) : 1)), 100 / (vz1 ? abs(vz1) : 1)); int s = rand_int(-hi, hi); vx2 = vx1 * s; vy2 = vy1 * s; vz2 = vz1 * s; /* s = rand_int(-hi, hi); x2 = x1 + vx1*s; y2 = y1 + vy1*s; z2 = z1 + vz1*s; */ /* if (rand_int(0,1) == 1) { vx1 = vy1 = vz1 = 0; } if (rand_int(0,1) == 1) { vx2 = vy2 = vz2 = 0; } */ } while (touch(x1,y1,z1,r1, x2,y2,z2,r2)); cout << x1 << ' ' << y1 << ' ' << z1 << ' ' << r1 << ' ' << vx1 << ' ' << vy1 << ' ' << vz1 << endl; cout << x2 << ' ' << y2 << ' ' << z2 << ' ' << r2 << ' ' << vx2 << ' ' << vy2 << ' ' << vz2 << endl; } int main(int argc, char *argv[]) { int T = atoi(argv[1]); cout << T << endl; for (int i = 0; i < T; i++) { random_case(); } return 0; }