ZOJ 3429 Cube Simulation (思维题)
题目
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3429
题意
给一个无限大的长方体,有击中操作:
- FILL(X,Y,Z) : 按照先Z轴,后Y轴,再X轴标号,
- SWAP1(x1,x2): 交换由X轴坐标为x1的点构成的平面 和 由X轴坐标为x2的点构成的平面
- SWAP2(y1,y2): 交换由Y轴坐标为y1的点构成的平面 和 由Y轴坐标为y2的点构成的平面
- SWAP3(z1,z2): 交换由Z轴坐标为z1的点构成的平面 和 由Z轴坐标为z2的点构成的平面
- FIND(value) : 输出找标号为value的点的坐标
- QUERY(x,y,z): 输出点(x, y, z)处的标号
解法
可以看出交换操作并不影响另外的两个坐标,比如SWAP1(x1, x2), 并不影响y1, y2, z1, z2。
所以可以用三个数组x, y, z表示坐标,交换时只需交换相应的数组内的值
初始时各位置的标号可以很容易算出
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1100;
int main() {
char op[10];
int X, Y, Z;
int a, b, c, val;
int px, py, pz;
int x[N], y[N], z[N];
while(~scanf("%s", op)) {
if(strcmp(op, "FILL") == 0) {
scanf("%d%d%d", &X, &Y, &Z);
printf("START\n");
for(int i = 0; i < X; i++)
x[i] = i;
for(int i = 0; i < Y; i++)
y[i] = i;
for(int i = 0; i < Z; i++)
z[i] = i;
}
else if(strcmp(op, "SWAP1") == 0) {
scanf("%d%d", &a, &b);
swap(x[a], x[b]);
}
else if(strcmp(op, "SWAP2") == 0) {
scanf("%d%d", &a, &b);
swap(y[a], y[b]);
}
else if(strcmp(op, "SWAP3") == 0) {
scanf("%d%d", &a, &b);
swap(z[a], z[b]);
}
else if(strcmp(op, "FIND") == 0) {
scanf("%d", &val);
if(val > X * Y * Z)
continue;
a = (val - 1) / (Z * Y);
b = ((val - 1) % (Z * Y)) / Z;
c = (val - 1) % Z;
for(int i = 0; i < X; i++) {if(x[i] == a) {px = i; break; } }
for(int i = 0; i < Y; i++) {if(y[i] == b) {py = i; break; } }
for(int i = 0; i < Z; i++) {if(z[i] == c) {pz = i; break; } }
printf("%d %d %d\n", px, py, pz);
}
else if(strcmp(op, "QUERY") == 0) {
scanf("%d%d%d", &a, &b, &c);
printf("%d\n", Y * Z * x[a] + Z * y[b] + z[c] + 1);
}
}
return 0;
}