莫名re求助
查看原帖
莫名re求助
292029
幽理家的男人楼主2020/10/10 21:12
#include<bits/stdc++.h>
using namespace std;
char si[8][8],ans[8][8];//存输入数据
int fa[200005],dp[200005],x[100005*4],cur;//fa用来记录上一个状态的二进制值,dp用来记录到达这个状态所需的步骤数,x记录答案(整个转移的过程)(感觉数组够大了,为什么re了)
int main(){
	for(int i=1;i<=4;++i){
		for(int j=1;j<=4;++j){
			cin>>si[i][j];
		}
	}
	for(int i=1;i<=4;++i){
		for(int j=1;j<=4;++j){
			cin>>si[i][j];
		}
	}
	queue<int> que;
	int temp=0,a=0;
	for(int i=1;i<=4;++i){
		for(int j=1;j<=4;++j){
			temp=temp*2+si[i][j]-'0';
			a=a*2+ans[i][j]-'0';
		}
	} 
	que.push(temp);
	fa[temp]=-1;
	dp[temp]=0;
	while(!que.empty()){
		int q=que.front();
		que.pop();
		int now[8][8]={0};
		for(int i=15;i>=0;--i){
			if((1<<i)&q){
				now[4-i/4][4-i%4]=1;
			}
		}
		for(int i=1;i<=4;++i){
			for(int j=1;j<=4;++j){
				if(i!=4){
					swap(now[i][j],now[i+1][j]);
		            int temp=0; 
	            	for(int ii=1;ii<=4;++ii){
	            		for(int jj=1;jj<=4;++jj){
			            	temp=temp*2+now[ii][jj];
		            	}
	            	}
	            	swap(now[i][j],now[i+1][j]);
	            	if(!fa[temp]){
	            		que.push(temp);
	            		fa[temp]=q;
	            		dp[temp]=dp[q]+1;
					}
			    }  
				temp=0;
				if(j!=4){
					swap(now[i][j],now[i][j+1]);
	            	for(int ii=1;ii<=4;++ii){
	            		for(int jj=1;jj<=4;++jj){
			            	temp=temp*2+now[ii][jj];
		            	}
	            	}
	            	swap(now[i][j],now[i][j+1]);
	            	if(!fa[temp]){
	            		que.push(temp);
	            		fa[temp]=q;
	            		dp[temp]=dp[q]+1;
					}
			    }
			}
		}
	}
	int kkk=a;
	cout<<dp[a]<<"\n";
	while(fa[a]!=-1){
		int now[8][8]={0};
		for(int i=15;i>=0;--i){
			if((1<<i)&a){
				now[4-i/4][4-i%4]=1;
			}
		}
		/*cout<<'#'<<"\n";
		for(int i=1;i<=4;++i){
			for(int j=1;j<=4;++j){
				cout<<now[i][j];
			}
			cout<<"\n";
		}
		*/
		int f[8][8]={0};
		for(int i=15;i>=0;--i){
			if((1<<i)&fa[a]){
				f[4-i/4][4-i%4]=1;
			}
		}
		for(int i=1;i<=4;++i){
			for(int j=1;j<=4;++j){
				if(now[i][j]!=f[i][j]){
					x[++cur]=i;
					x[++cur]=j;
				}
			}
		}
		a=fa[a];		
	}
	for(int i=dp[kkk];i>=1;--i){
		for(int j=4*i-3;j<=4*i;++j){
			cout<<x[j];
		}
		cout<<"\n";
	}
	return 0;
}

所有点都re了(蒟蒻救助)

2020/10/10 21:12
加载中...