题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4113
思路:这个就是三维数组的地址和下标之间的对应。 然后涉及到一定的变换 ,我们有一个p【a】 记录在若干次对换之后实际对应的是哪个数。 同时,为了能用find函数找回坐标,我们还要记录反函数(写作pp【a】)
然后这个value超过的xyz是不要输出的。
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int p[1010];
int q[1010];
int r[1010];
int pp[1010];
int qq[1010];
int rr[1010];
int x=1,y=1,z=1;
int findx(int n)
{
return (n)/(y*z);
}
int findy(int n)
{
return (n%(y*z))/z;
}
int findz(int n)
{
return (n%z);
}
void pre()
{
for(int i=0;i<1010;i++)
{
p[i]=i;
q[i]=i;
r[i]=i;
pp[i]=i;
qq[i]=i;
rr[i]=i;
}
}
int main()
{
string opcode;
int a,b;
int ansx,ansy,ansz;
int value;
int qx,qy,qz;
int ans;
while(cin>>opcode)
{
if(opcode=="FILL")
{
pre();
cout<<"START"<<endl;
cin>>x>>y>>z;
}
else if(opcode=="SWAP1")
{
scanf("%d%d",&a,&b);
swap(p[a],p[b]);
pp[p[a]]=a;
pp[p[b]]=b;
}
else if(opcode=="SWAP2")
{
scanf("%d%d",&a,&b);
swap(q[a],q[b]);
qq[q[a]]=a;
qq[q[b]]=b;
}
else if(opcode=="SWAP3")
{
scanf("%d%d",&a,&b);
swap(r[a],r[b]);
rr[r[a]]=a;
rr[r[b]]=b;
}
else if(opcode=="FIND")
{
scanf("%d",&value);
if(value<=x*y*z&&value>0)
{
ansx=findx(value-1);
ansy=findy(value-1);
ansz=findz(value-1);
ansx=pp[ansx];
ansy=qq[ansy];
ansz=rr[ansz];
printf("%d %d %d\n",ansx,ansy,ansz);
}
}
else if(opcode=="QUERY")
{
scanf("%d%d%d",&qx,&qy,&qz);
if(qx>=0&&qx<x&&qy>=0&&qy<y&&qz>=0&&qz<z)
{
ans=p[qx]*y*z+q[qy]*z+r[qz];
printf("%d\n",ans+1);
}
}
}
}