rt,剩下的全是RE,帮看看哪里出事了
#include <bits/stdc++.h>
#define isdigit(x) ((x)>='0'&&(x)<='9')
using namespace std;
const int N=55;
const int M=410;
int n,m;
int cnt[N][N],num;
stack<int> S[N];
pair<int,int> ans[N];
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x;
}
void transfer(int x,int y)
{
ans[++num].first=x;
ans[num].second=y;
S[y].push(S[x].top());
S[x].pop();
cnt[y][S[y].top()]++;
cnt[x][S[y].top()]--;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) S[i].push(read()),cnt[i][S[i].top()]++;
for(int sp=n+1;sp>=2;sp--)
{
for(int i=1;i<sp;i++) while(S[i].size()<m) transfer(sp,i);
int now=S[1].top();
for(int i=1;i<sp;i++) while(S[i].size()&&S[i].top()==now) transfer(i,sp);
for(int i=1;i<sp;i++)
{
if(!cnt[i][now]) continue;
while(S[i].size()&&S[i].top()!=now)
{
for(int j=1;j<=sp;j++)
{
if(i==j||S[j].size()==m) continue;
while(S[i].size()&&S[i].top()!=now&&S[j].size()<m) transfer(i,j);
if(S[i].size()&&S[i].top()==now) break;
}
}
if(S[sp].size()&&S[sp].top()!=now)
{
int tar;
if(S[sp].size()==m)
{
for(int j=1;j<sp;j++)
{
if(i==j||S[j].size()==m) continue;
transfer(i,j);tar=j;
break;
}
}
else
{
for(int j=1;j<sp;j++)
{
if(i==j||S[j].empty()) continue;
transfer(j,sp);tar=j;
transfer(i,j);
}
}
while(S[sp].size()&&S[sp].top()!=now) transfer(sp,i);
transfer(tar,sp);
}
else transfer(i,sp);
if(cnt[i][now]) i--;
}
}
printf("%d\n",num);
for(int i=1;i<=num;i++) printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}