移球游戏10pts全RE求助
  • 板块灌水区
  • 楼主zhzkiller
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/27 07:37
  • 上次更新2023/11/2 11:16:21
查看原帖
移球游戏10pts全RE求助
764944
zhzkiller楼主2023/10/27 07:37

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;
}
2023/10/27 07:37
加载中...