rt,前8个点正常输出,后12个点就开始胡乱输出,数组没开小,也没特判什么m≥300胡乱输出,好像程序有了自己的思想一样自己跑了个不知道啥玩意的东西。
#include<iostream>
using namespace std;
int n,m;
int ball[55][444];
bool col[55];
int tot[55][55];
int top[55];
int cnt[55];
int ans[820001][2],a;
void dfs(int r){
int goal=0;
for(int i=1;i<=n;i++){
if(!col[i]){goal=i;break;}
}
if(goal==0)return;
col[goal]=1;
for(int i=1;i<=r;){
if(tot[i][goal]){//当前柱子有目标球
while(tot[i][goal]){//写个while慢慢搬
int j=1;
while(j<i&&ball[i][top[i]]!=goal){//先把前面空着的填上
if(top[j]==m){j++;continue;}//满的,下一个
cnt[j]++;//之后还得再搬回去
a++;
ans[a][0]=i,ans[a][1]=j;
ball[j][++top[j]]=ball[i][top[i]--];ball[i][top[i]+1]=0;
}
if(ball[i][top[i]]!=goal){//前面空着的都填上了,还没到目标球
while(ball[i][top[i]]!=goal){//那就往r+1上搬
cnt[r+1]++;//这个也得搬回去
a++;
ans[a][0]=i,ans[a][1]=r+1;
ball[r+1][++top[r+1]]=ball[i][top[i]--];ball[i][top[i]+1]=0;
}
cnt[r+1]++;
a++;
ans[a][0]=i+1,ans[a][1]=r+1;
ball[r+1][++top[r+1]]=ball[i+1][top[i+1]--];ball[i+1][top[i+1]+1]=0;
tot[i+1][ball[r+1][top[r+1]]]--;
tot[i][ball[r+1][top[r+1]]]++;//因为最后这个球还要回到i
a++;
ans[a][0]=i,ans[a][1]=i+1;
ball[i+1][++top[i+1]]=ball[i][top[i]--];ball[i][top[i]+1]=0;
while(cnt[r+1]){
cnt[r+1]--;
a++;
ans[a][0]=r+1,ans[a][1]=i;
ball[i][++top[i]]=ball[r+1][top[r+1]--];ball[r+1][top[r+1]+1]=0;
}
a++;
ans[a][0]=i+1,ans[a][1]=r+1;
ball[r+1][++top[r+1]]=ball[i+1][top[i+1]--];ball[i+1][top[i+1]+1]=0;
tot[i][goal]--;
a++;
ans[a][0]=i,ans[a][1]=i+1;
tot[i][ball[i][top[i]]]--;
tot[i+1][ball[i][top[i]]]++;
ball[i+1][++top[i+1]]=ball[i][top[i]--];ball[i][top[i]+1]=0;
}
else{//已经达到目标球,直接搬过去就行了
a++;
ans[a][0]=i,ans[a][1]=r+1;
tot[i][goal]--;
ball[r+1][++top[r+1]]=ball[i][top[i]--];ball[i][top[i]+1]=0;
}
}
int j=1;
for(int j=1;j<i;j++){
if(!cnt[j])continue;
while(cnt[j]){
cnt[j]--;//再把之前搬过去的球都搬回来
a++;
ans[a][0]=j,ans[a][1]=i;
ball[i][++top[i]]=ball[j][top[j]--];ball[j][top[j]+1]=0;
}
}
}
else{
i++;
}
}
for(int j=1;j<r;j++){//把r柱腾出位置,下一个dfs往r柱上搬
while(top[j]!=m){
a++;
ans[a][0]=r,ans[a][1]=j;
ball[j][++top[j]]=ball[r][top[r]--];ball[r][top[r]+1]=0;
tot[j][ball[j][top[j]]]++;
}
}
dfs(r-1);
}
int main(){
freopen("ball9.in","r",stdin);
freopen("ball.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ball[i][j];
tot[i][ball[i][j]]++;
}
top[i]=m;
}
dfs(n);
cout<<a<<'\n';
for(int i=1;i<=a;i++)cout<<ans[i][0]<<' '<<ans[i][1]<<'\n';
return 0;
}