TLE in#8#9
查看原帖
TLE in#8#9
427590
SHENTONG_ZY楼主2024/3/20 18:17

dfs从右往左枚举每一列

dfs0从上到下枚举每一列上的数字

#include<bits/stdc++.h>
using namespace std;
int n,zm[30];
string s[4];
bool num[30];
void print(){
	for(int i=1;i<=n;i++) printf("%d ",zm[i]);
	exit(0);
}
void dfs0(int step,int carry,int h);
void dfs(int step,int carry);
void dfs0(int step,int carry,int h){
	if(h==4){
		int val1=zm[int(s[1][n-step-1])-'A'+1];
		int val2=zm[int(s[2][n-step-1])-'A'+1];
		int val3=zm[int(s[3][n-step-1])-'A'+1];
		if((val1+val2+carry)%n==val3) dfs(step+1,(val1+val2+carry)/n);
		return;
	}
	int z=int(s[h][n-step-1])-'A'+1;
	if(zm[z]!=-1) dfs0(step,carry,h+1);//字母已经确定便跳到下一行
	if(zm[z]==-1){
		for(int i=0;i<n;i++){
			if(num[i]==1) continue;
			num[i]=1;
			zm[z]=i;
			dfs0(step,carry,h+1);
			zm[z]=-1;
			num[i]=0;		
		}
	}
	
}
void dfs(int step,int carry){
	if(step==n&&carry==0){
		print();
		return;
	}
	dfs0(step,carry,1); 
}
int main(){
	cin>>n;
	for(int i=0;i<=n;i++) zm[i]=-1; 
	cin>>s[1]>>s[2]>>s[3];
	dfs(0,0);
	
	return 0;
}
2024/3/20 18:17
加载中...