QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#505058 | #1646. Disk Sort | JHN021 | RE | 0ms | 3880kb | C++14 | 3.7kb | 2024-08-04 19:06:20 | 2024-08-04 19:06:21 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e3;
int n,C[MAXN+5][3],tp[MAXN+5],Empty;
pair<int,int> ans[6*MAXN+5];int tot;
inline void Move(int a,int b)
{
C[b][++tp[b]]=C[a][tp[a]];
C[a][tp[a]--]=0;
ans[++tot]=make_pair(a,b);
}
int main()
{
scanf("%d",&n);
for(int i=2;i>=0;i--)
for(int j=1;j<=n;j++)
scanf("%d",&C[j][i]);
for(int i=1;i<=n;i++) tp[i]=2; tp[n+1]=-1;
Empty=n+1;
while(1)
{
bool OK=1;
for(int i=1;i<=n+1;i++)
{
if(C[i][2]==C[i][1] && C[i][1]==C[i][0]) continue;
OK=0;
if(C[i][2]==C[i][1])
{
int x=0,y=0;
for(int j=i+1;j<=n+1;j++)
{
for(int k=0;k<3;k++) if(C[j][k]==C[i][2]) {x=j,y=k;break;}
if(x) break;
}
if(y==2)
{
Move(x,Empty);
Move(i,Empty);
Move(i,Empty);
Move(i,x);
Empty=i;
}
else if(y==1)
{
Move(i,Empty);
Move(i,Empty);
Move(x,i);
Move(x,Empty);
Move(x,i);
Empty=x;
}
else
{
Move(x,Empty);
Move(x,Empty);
Move(i,x);
Move(i,x);
Move(i,Empty);
Empty=i;
}
}
else if(C[i][2]==C[i][0])
{
int x=0,y=0;
for(int j=i+1;j<=n+1;j++)
{
for(int k=0;k<3;k++) if(C[j][k]==C[i][2]) {x=j,y=k;break;}
if(x) break;
}
if(y==2)
{
Move(i,Empty);
Move(i,Empty);
Move(x,i);
Move(Empty,x);
Move(Empty,i);
}
else if(y==1)
{
Move(i,Empty);
Move(x,i);
Move(x,Empty);
Move(i,x);
Move(i,x);
Move(i,Empty);
Empty=i;
}
else
{
Move(x,Empty);
Move(x,Empty);
Move(i,x);
Move(i,Empty);
Move(i,x);
Empty=i;
}
}
else
{
int x=0,y=0,a=0,b=0;
for(int j=i+1;j<=n+1;j++)
{
for(int k=0;k<3;k++)
if(C[j][k]==C[i][2])
{
if(x) {a=j,b=k;break;}
else x=j,y=k;
}
if(a) break;
}
if(y<b) swap(x,a),swap(y,b);
if(x==a)
{
if(y==2)
{
if(b==1)
{
Move(i,Empty);
Move(x,Empty);
Move(x,Empty);
Move(x,i);
Empty=x;
}
else
{
Move(i,Empty);
Move(x,Empty);
Move(x,i);
Move(x,Empty);
Empty=x;
}
}
else
{
Move(i,Empty);
Move(x,i);
Move(Empty,x);
}
}
else
{
if(y==2)
{
if(b==2)
{
Move(i,Empty);
Move(x,Empty);
Move(a,Empty);
Move(a,i);
Move(a,x);
Empty=a;
}
else if(b==1)
{
Move(i,Empty);
Move(x,Empty);
Move(a,i);
Move(a,Empty);
Move(a,x);
Empty=a;
}
else
{
Move(i,Empty);
Move(x,Empty);
Move(a,i);
Move(a,x);
Move(a,Empty);
Empty=a;
}
}
else if(y==1)
{
if(b==1)
{
Move(i,Empty);
Move(x,i);
Move(x,Empty);
Move(a,x);
Move(a,Empty);
Move(a,x);
Empty=a;
}
else
{
Move(i,Empty);
Move(x,i);
Move(x,Empty);
Move(a,x);
Move(a,x);
Move(a,Empty);
Empty=a;
}
}
else
{
Move(a,Empty);
Move(a,Empty);
Move(i,a);
Move(x,Empty);
Move(x,i);
Move(x,a);
Empty=x;
}
}
}
}
if(OK) break;
}
if(Empty!=n+1) Move(n+1,Empty),Move(n+1,Empty),Move(n+1,Empty);
printf("%d\n",tot);
for(int i=1;i<=tot;i++) printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3800kb
input:
4 2 3 1 4 2 1 1 4 2 3 3 4
output:
8 3 5 3 5 2 3 2 5 2 3 5 2 5 2 5 2
result:
ok n=4
Test #2:
score: 0
Accepted
time: 0ms
memory: 3880kb
input:
2 1 2 1 2 1 2
output:
0
result:
ok n=2
Test #3:
score: -100
Runtime Error
input:
3 2 2 1 1 3 3 1 2 3