社区讨论

样例过了,wa完

P11967[GESP202503 八级] 割裂参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjochnp
此快照首次捕获于
2025/11/04 05:51
4 个月前
此快照最后确认于
2025/11/04 05:51
4 个月前
查看原帖
help!
CPP
#include<bits/stdc++.h>

using namespace std;

#define int long long

inline int read(){
	char c=getchar();
	bool b=0;
	while(c<'0'||c>'9'){
		if(c=='-'){
			b=1;
		}
		c=getchar();
	}
	int res=0;
	while(c>='0'&&c<='9'){
		res=res*10+(c-'0');
		c=getchar();
	}
	if(b){
		return -res;
	}
	return res;
}

int goal[4][4]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}};
int s[4][4];
int X[5]={0,0,1,-1,0};
int Y[5]={0,1,0,0,-1};
int ans;

int h(int tt[4][4]){
	int res=0;
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			if(goal[i][j]!=tt[i][j]&&tt[i][j]!=0){
				res++;
			}
		}
	}
	return res;
}

bool dfs(int dep,int tt[4][4],int lst){
	if(h(tt)==0){
		return 1;
	}
	if(dep+h(tt)>ans){
		return 0;
	}
	int x0,y0;
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			if(tt[i][j]==0){
				x0=i,y0=j;
			}
		}
	}
	for(int i=1;i<=4;i++){
		int ox=X[i]+x0,oy=Y[i]+y0;
		if((lst==1)&&(i==4)||(lst==4)&&(i==1)||(lst==2)&&(i==3)||(lst==3)&&(i==2)){
			continue;
		}
		if(ox<1||ox>3||oy<1||oy>3){
			continue;
		}
		swap(tt[ox][oy],tt[x0][y0]);
		if(dfs(dep+1,tt,i)){
			return 1;
		}
		swap(tt[ox][oy],tt[x0][y0]);
	}
	return 0;
}

signed main(){
	string str;
	cin>>str;
	str=" "+str;
	int cnt=1;
	for(int i=1;i<=9;i++){
		int ord1=i/3+1,ord2=i%3;
		if(i%3==0){
			ord1--;
			ord2=3;
		}
		s[ord1][ord2]=(str[i]-'0');
	}
	if(h(s)==0){
		cout<<0<<'\n';
		return 0;
	}
	for(ans=1;;ans++){
		
		if(dfs(0,s,-1)){
			cout<<ans<<'\n';
			return 0;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...