40pts求助,后几个点程序抽风不知道在输出啥
查看原帖
40pts求助,后几个点程序抽风不知道在输出啥
593613
olegekei楼主2022/11/4 15:10

rt,前8个点正常输出,后12个点就开始胡乱输出,数组没开小,也没特判什么m\ge300胡乱输出,好像程序有了自己的思想一样自己跑了个不知道啥玩意的东西。

#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;
}
2022/11/4 15:10
加载中...