蒟蒻求助!P4929全RE,求大佬告诉我RE的原因:(
  • 板块题目总版
  • 楼主X_X_M
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/6/6 21:12
  • 上次更新2023/10/27 23:50:26
查看原帖
蒟蒻求助!P4929全RE,求大佬告诉我RE的原因:(
363149
X_X_M楼主2022/6/6 21:12

附上本人写得很烂的用坐标差模拟指针的舞蹈链(不喜勿喷

话说RE的原因是啥啊(

#include <bits/stdc++.h>
using namespace std;

struct node{
	int upx,downx,lefty,righty,h,l;
	bool b;
};

stack <int>ans;
node a[501][501]; 
int n,m,ha;
bool fl;

void restart(){                                    
	for(int i=0;i<=m;i++){
		if(!i){
			a[0][0].lefty=m;
			a[0][0].righty=1;
		}else if(i==m){
			a[0][m].righty=-m;
			a[0][m].lefty=-1;
		}else{
			a[0][i].righty=1;
			a[0][i].lefty=-1;
		}
		a[0][i].b=1;
		a[0][i].h=0;
		a[0][i].l=i;
	}
}

void start(){
	int k,l;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j].b){
				k=i;l=j;
				while(true){
					k++;
					if(k==n+1){
						k-=(1+n);
					}
					if(a[k][l].b){
						a[i][l].downx=k-i;
						a[k][l].upx=i-k;
						break;
					}
				}
				while(true){
					k--;
					if(k==-1){
						k+=(1+n);
					}
					if(a[k][l].b){
						a[i][l].upx=k-i;
						a[k][l].downx=i-k;
						break;
					}
				}
				while(true){
					l--;
					if(l==-1){
						l+=(1+n);
					}
					if(a[k][l].b){
						a[k][j].lefty=l-i;
						a[k][l].righty=i-l;
						break;
					}
				}
				while(true){
					l++;
					if(l==m+1){
						l-=(1+m);
					}
					if(a[k][l].b){
						a[k][j].righty=l-i;
						a[k][l].lefty=i-l;
						break;
					}
				}
			}
		}
	}
}

bool dance(int ud,bool flag2){
	int po[1000],po2[1000],p3;
	bool flag=0;
	if(!(a[0][0].righty-m) && fl){
		return 1;
	}
	if(ans.size()==m){
		return 0;
	}
	if(ans.size()+1==m){
		fl=1;
	}else{
		fl=0;
	}
	if(!flag2){	
		for(int i=1;i<=m;i++){
			if(a[0][i].upx){
				flag=1;
				break;
			}
		}
	}
	if(!flag){
		memset(po,0,sizeof(po));
		memset(po2,0,sizeof(po2));
		ans.pop();
		for(int i=0;i<=n;i++){
			if(a[i][ud].b){
				a[i][a[i][ud].lefty+a[i][ud].l].righty-=a[i][ud].righty;
				a[i][a[i][ud].righty+a[i][ud].l].lefty-=a[i][ud].lefty;
				if(i){
					po[i]=1;
				}
			}
		}
		for(int i=0;i<=n;i++){
			if(po[i]){
				for(int j=1;j<=m;j++){
					if(j==ud){
						continue;
					}
					if(a[i][j].b){
						a[a[i][j].h+a[i][j].upx][j].downx-=a[i][j].downx;
						a[a[i][j].h+a[i][j].downx][j].upx-=a[i][j].upx;
						po2[j]=j;
					}
				}
			}
		}
		for(int i=1;i<=m;i++){
			if(po2[i]){
				for(int j=0;j<=n;j++){
					if(po2[i]==j){
						continue;
					}
					if(a[j][i].b){
						a[j][a[j][i].lefty+a[j][i].l].righty-=a[j][i].righty;
						a[j][a[j][i].righty+a[j][i].l].lefty-=a[j][i].lefty;
					}
				}
			}
		}
		if(a[0][ud].l+a[0][ud].righty){
			ans.push(a[0][ud].l+a[0][ud].righty);	
			if(dance(a[0][ud].l+a[0][ud].righty,0)){
				return 1;
			}else{
				ans.pop();
				if(ans.empty()){
					return 0;
				}else{
					dance(ans.top(),1);
				}
			}	
		}else{
			return 0;
		}
	}
	memset(po,0,sizeof(po));
	memset(po2,0,sizeof(po2));
	for(int i=0;i<=n;i++){
		if(a[i][ud].b){
			a[i][a[i][ud].lefty+a[i][ud].l].righty+=a[i][ud].righty;
			a[i][a[i][ud].righty+a[i][ud].l].lefty+=a[i][ud].lefty;
			if(i){
				po[i]=1;
			}
		}
	}
	for(int i=0;i<=n;i++){
		if(po[i]){
			for(int j=1;j<=m;j++){
				if(j==ud){
					continue;
				}
				if(a[i][j].b){
					a[a[i][j].h+a[i][j].upx][j].downx+=a[i][j].downx;
					a[a[i][j].h+a[i][j].downx][j].upx+=a[i][j].upx;
					po2[j]=j;
				}
			}
		}
	}
	for(int i=1;i<=m;i++){
		if(po2[i]){
			for(int j=0;j<=n;j++){
				if(po2[i]==j){
					continue;
				}
				if(a[j][i].b){
					a[j][a[j][i].lefty+a[j][i].l].righty+=a[j][i].righty;
					a[j][a[j][i].righty+a[j][i].l].lefty+=a[j][i].lefty;
				}
			}
		}
	}
	ans.push(a[0][0].righty);
	return dance(a[0][0].righty,0);
}

void out(){
	int ap[1000],count=1;
	while(!ans.empty()){
		ap[count]=ans.top();
		ans.pop();
		count++;
	}
	for(int i=1;i<count;i++){
		if(ap[i]){
			cout << ap[i] << " ";	
		}
	}
}

int main(){
	cin >> n >> m;
	restart();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin >> a[j][i].b;
			a[j][i].h=i;
			a[j][i].l=j;
		}
	}
	start();
	ans.push(1);
	if(dance(1,0)){
		out();
	}else{
		cout << "No Solution!";
	}
	return 0;
} 
2022/6/6 21:12
加载中...