社区讨论

我女装学搜索还是玄学WA,求助

P1092[NOIP 2004 提高组] 虫食算参与者 25已保存回复 25

讨论操作

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

当前回复
25 条
当前快照
1 份
快照标识符
@mi6tiy3o
此快照首次捕获于
2025/11/20 10:34
4 个月前
此快照最后确认于
2025/11/20 15:02
4 个月前
查看原帖
这道题我打了4份代码了,真的心累,为什么有时候会没有解输出,比如这组数据:
CPP
8
ABDEBEHG
FGDBBAGB
EDEDCHGE

这是代码
CPP
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <map>
using namespace std;
const int maxn=31;
char s1[maxn],s2[maxn],s3[maxn];
int a[5][maxn],f[maxn],n,work=0;
bool vis[maxn];
inline bool check(){
   for(register int i=1;i<=n;i++)
     if(f[i]==-1)return 0;
	return 1; 
}
inline bool finish(){
	int forward=0;
	for(register int i=n;i>=1;i--){
		//if(f[i]==-1)return 0;
		if((f[a[1][i]]+f[a[2][i]]+forward)%n!=f[a[3][i]])return 0;
		forward=(f[a[1][i]]+f[a[2][i]]+forward)/n;
	}
	return 1;
} 
inline void init(){
	scanf("%d",&n);
	scanf("%s",s1);scanf("%s",s2);scanf("%s",s3);
	for(register int i=0;i<n;i++){
		a[1][i+1]=s1[i]-'A'+1,a[2][i+1]=s2[i]-'A'+1,a[3][i+1]=s3[i]-'A'+1;
	}
	memset(f,-1,sizeof(f));
	return ;
}
inline bool ok(){
	if(f[a[1][1]]+f[a[2][1]]>=n)return 0;
	for(register int i=n;i>=1;i--){
		int x=f[a[1][i]],y=f[a[2][i]],z=f[a[3][i]];
		if(x==-1||y==-1||z==-1)continue;
		if((x+y)%n!=z&&(x+y+1)%n!=z)return 0;
	}
	return 1;
}
bool dfs(int line,int now,int forward){
	cout<<line<<' '<<now<<endl;
	if(!ok())return 0;
	if(check()){
	   if(work==n||finish()){
		  for(register int i=1;i<=n;i++)printf("%d ",f[i]);
		  return 1;//exit(0);
	   }
	   return 0;
    }
	int x=a[line][now];
	if(f[x]==-1){
		for(register int i=n-1;i>=0;i--){
			if(!vis[i]){
				if(line!=3){
				  f[x]=i,vis[i]=1;
				  if(dfs(line+1,now,forward))return 1;
				  f[x]=-1,vis[i]=0;
			    }
			    else{
			      int sum=f[a[1][now]]+f[a[2][now]]+forward;
			      if(sum%n!=i)continue;
			      f[x]=i,vis[i]=1,work++;
			      if(dfs(1,now-1,sum/n))return 1;
			      f[x]=-1,vis[i]=0,work--;
				}
			}
		}
	}
	else{
		if(line!=3)if(dfs(line+1,now,forward))return 1;
		else{
			if(!ok())return 0;
			work++;
			if(dfs(1,now-1,(f[a[1][now]]+f[a[2][now]]+forward)/n))return 1;
			work--;
		}
	}
	return 0;
}
int main()
{
	init();
	dfs(1,n,0);
	return 0;
}

回复

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

正在加载回复...