简单搜索,90pts,死活TLE
查看原帖
简单搜索,90pts,死活TLE
416192
kbzcz楼主2023/6/22 15:59
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=30;
int n,num[N],b[4][N],jw[N],mx,bk;
char a[4][N];
bool bj,vis[N];
void dfs(int k,int x) {
	if(bj) return ;
	if(x>n) {
		for(int i=1;i<=n;i++) printf("%d ",num[i-1]);
		bj=1;
		return ;
	}
	if(num[a[1][n]-'A']+num[a[2][n]-'A']>=n) return ;
	if(k>3) {
		if(b[1][x]+b[2][x]+jw[x]!=b[3][x]&&b[1][x]+b[2][x]-n+jw[x]!=b[3][x]) return ;
		jw[x+1]=(b[1][x]+b[2][x]+jw[x]>=n);
		dfs(1,x+1);
		jw[x+1]=0;
		return ;
	}
	if(num[a[k][x]-'A']||bk==a[k][x]-'A') {
		b[k][x]=num[a[k][x]-'A'];
		dfs(k+1,x);
		b[k][x]=0;
		return ;
	}
	if(k==3&&vis[b[1][x]+b[2][x]+jw[x]]) return ;
	for(int i=n-1;i>=0;i--) {
		if(vis[i]) continue;
		if(i==0) bk=a[k][x]-'A';
		vis[i]=1;
		num[a[k][x]-'A']=b[k][x]=i;
		dfs(k+1,x);
		num[a[k][x]-'A']=b[k][x]=0;
		vis[i]=0;
		if(i==0) bk=-1;
	}
}
int main() {
	scanf("%d",&n);
	scanf("%s%s%s",a[1]+1,a[2]+1,a[3]+1);
	reverse(a[1]+1,a[1]+1+n);
	reverse(a[2]+1,a[2]+1+n);
	reverse(a[3]+1,a[3]+1+n);
	bk=-1;
	dfs(1,1);
}
2023/6/22 15:59
加载中...