90pts,蒟蒻求助
查看原帖
90pts,蒟蒻求助
572587
cmrhhh楼主2023/7/16 13:29

蒟蒻调了好久,要累死了,来祸害A掉本题的大佬

蒟蒻的代码思路就是全排列字母所代表的数字。

所加的优化有:

1字母从右往左枚举数字,数字从大到小枚举
2判断(A+B+1)%n!=C&&(A+B)%n!=C
3判断最高位有无进位
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,book[50]={0},vis[50],nxt[50],bj[50]={0},cnt=0;//bj:标记;book[]相当于字母代表的数字 
int s1[50],s2[50],s3[50];
string ss1,ss2,ss3;
void judge(){
	int d=0,pre_d=0;
	for(int i=0;i<n;i++){
		d=(book[s1[i]]+book[s2[i]]+pre_d)/n;
		if((book[s1[i]]+book[s2[i]]+pre_d)%n!=book[s3[i]])return;
		pre_d=d;
	}
	for(int i=0;i<n;i++)printf("%d ",book[i]);
	exit(0);
}
void dfs(int now){
	if(now>=n)judge();
	if(book[s1[n-1]]!=-1&&book[s2[n-1]]!=-1&&book[s1[n-1]]+book[s2[n-1]]>=n)return;
	for(int i=0;i<n;i++){
		if(book[s1[i]]==-1||book[s2[i]]==-1||book[s3[i]]==-1)continue;
		if((book[s1[i]]+book[s2[i]])%n!=book[s3[i]]&&(book[s1[i]]+book[s2[i]]+1)%n!=book[s3[i]])return;
	} 
	for(int i=0;i<n;i++){
		if(!vis[i]){
			vis[i]=1;
			book[nxt[now]]=i;
			dfs(now+1);
			vis[i]=0;
			book[nxt[now]]=-1;
		}	
	}
}
int main(){
	cin>>n>>ss1>>ss2>>ss3;
	memset(book,-1,sizeof book);
	for(int i=0;i<n;i++){//倒序存储 
		s1[n-i-1]=ss1[i]-'A';
		s2[n-i-1]=ss2[i]-'A';
		s3[n-i-1]=ss3[i]-'A';
		if(!bj[s1[n-i-1]]){nxt[cnt++]=s1[n-i-1];bj[s1[n-i-1]]=1;}
		if(!bj[s2[n-i-1]]){nxt[cnt++]=s2[n-i-1];bj[s2[n-i-1]]=1;}
		if(!bj[s3[n-i-1]]){nxt[cnt++]=s3[n-i-1];bj[s3[n-i-1]]=1;}
	}
	dfs(0);
	
	return 0;
} 
//20
//NLHFIEASBRQJOGKMDPCT
//NQGPSIIGKDMFDCBFMQSO
//PNKNTOLHEIJHFGJKHJGG

//18 14 0 9 15 17 7 13 12 16 1 10 4 2 8 5 11 3 6 19


2023/7/16 13:29
加载中...