#include<bits/stdc++.h>
using namespace std;
struct movem{int x,y;}mm[820005];
int n,m,r[55][405],kk,bl,h[55],book[55],cnt,num;
inline void move(int x,int y){
mm[++kk].x=x,mm[kk].y=y,r[y][++h[y]]=r[x][h[x]--],r[x][h[x]+1]=0;
while(mm[kk-1].y==mm[kk].x){
mm[kk-1].y=mm[kk--].y;
while(mm[kk].x==mm[kk].y)--kk;
}
}
int main(){
scanf("%d%d",&n,&m),bl=n+1;
for(int i(1);i<=n;++i)for(int j(1);j<=m;++j)scanf("%d",&r[i][j]);
for(int i(1);i<=n;++i)h[i]=m;
for(int i(2);i<=n;++i){
for(int j(1);j<=n+1;++j){
if(j==bl)continue;
cnt=0,num=1;
for(int k(1);k<=m;++k)if(r[j][k]==i)++cnt;
while(num==bl||num==j)++num;
for(int k(1);k<=cnt;++k)move(num,bl);
for(int k(1);k<=m;++k){
if(r[j][h[j]]==i)move(j,num);
else move(j,bl);
}
for(int k(1);k<=m-cnt;++k)move(bl,j);
for(int k(1);k<=cnt;++k)move(num,j);
for(int k(1);k<=cnt;++k)move(bl,num);
}
for(int j(1);j<=n+1;++j){
if(j==bl)continue;
while(r[j][h[j]]==i)move(j,bl);
}
book[bl]=1,num=1;
while(book[num])++num;
for(int j(1);j<=n+1;++j){
if(j==num||j==bl)continue;
while(h[j]<m)move(num,j);
}
bl=num;
}
printf("%d\n",kk);
for(int i(1);i<=kk;++i)printf("%d %d\n",mm[i].x,mm[i].y);
return 0;
}
2 20
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1
这个数据checker是ok,洛谷就WA了(B 1:half stacked rod),去掉move中的while有40pts,剩下WA(O2 RE)
求助QwQ