社区讨论

求帮忙看下

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi6z9g2w
此快照首次捕获于
2025/11/20 13:15
4 个月前
此快照最后确认于
2025/11/20 13:15
4 个月前
查看原帖
#include #include #include #include
using namespace std;
int n,ans[101]; char a[101],b[101],c[101]; bool vis[101];
void dfs(int x,int jw){ if(!x){ if(jw)return; for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } exit(0); } if(ans[a[x]-'A'+1]==-1 and ans[b[x]-'A'+1]==-1){ if(a[x]==b[x]){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[a[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+i+jw)%n!=ans[c[x]-'A'+1]){ vis[i]=0,ans[a[x]-'A'+1]=-1; continue; } if(vis[(i+i+jw)%n] and ans[c[x]-'A'+1]==-1){ vis[i]=0,ans[a[x]-'A'+1]=-1; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+i+jw)%n,flag=0,vis[(i+i+jw)%n]=1; dfs(x-1,(i+i+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+i+jw)%n]=0; ans[i]=-1; vis[i]=0; } } } else { for(int i=0;i<n;i++){ if(!vis[i]){ for(int j=0;j<n;j++){ if(vis[j] or i==j)continue; bool flag=1; vis[i]=vis[j]=1; ans[a[x]-'A'+1]=i; ans[b[x]-'A'+1]=j; if(ans[c[x]-'A'+1]!=-1 and (i+j+jw)%n!=ans[c[x]-'A'+1]){ ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; continue; } if(vis[(i+j+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+j+jw)%n,flag=0,vis[(i+j+jw)%n]=1; dfs(x-1,(i+j+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+j+jw)%n]=0; ans[a[x]-'A'+1]=ans[b[x]-'A'+1]=-1; vis[i]=vis[j]=0; } } } } } else if(ans[a[x]-'A'+1]==-1){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[a[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+ans[b[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){ ans[a[x]-'A'+1]=-1; vis[i]=0; continue; } if(vis[(i+ans[b[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[a[x]-'A'+1]=-1; vis[i]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[b[x]-'A'+1]+jw)%n,flag=0,vis[(i+ans[b[x]-'A'+1]+jw)%n]=1; dfs(x-1,(i+ans[b[x]-'A'+1]+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[b[x]-'A'+1]+jw)%n]=0; ans[a[x]-'A'+1]=-1; vis[i]=0; } } } else if(ans[b[x]-'A'+1]==-1){ for(int i=0;i<n;i++){ if(!vis[i]){ bool flag=1; vis[i]=1; ans[b[x]-'A'+1]=i; if(ans[c[x]-'A'+1]!=-1 and (i+ans[a[x]-'A'+1]+jw)%n!=ans[c[x]-'A'+1]){ ans[b[x]-'A'+1]=-1; vis[i]=0; continue; } if(vis[(i+ans[a[x]-'A'+1]+jw)%n] and ans[c[x]-'A'+1]==-1){ ans[b[x]-'A'+1]=-1; vis[i]=0; continue; } if(ans[c[x]-'A'+1]==-1)ans[c[x]-'A'+1]=(i+ans[a[x]-'A'+1]+jw)%n,vis[(i+ans[a[x]-'A'+1]+jw)%n]=1,flag=0; dfs(x-1,(i+ans[a[x]-'A'+1]+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(i+ans[a[x]-'A'+1]+jw)%n]=0; ans[b[x]-'A'+1]=-1; vis[i]=0; } } }else { bool flag=1; int xx=ans[b[x]-'A'+1],yy=ans[a[x]-'A'+1]; if(ans[c[x]-'A'+1]!=-1){ if((xx+yy+jw)%n!=ans[c[x]-'A'+1])return; } else { if(vis[(xx+yy+jw)%n])return; ans[c[x]-'A'+1]=(xx+yy+jw)%n; vis[(xx+yy+jw)%n]=1; flag=0; } dfs(x-1,(xx+yy+jw)/n); if(!flag)ans[c[x]-'A'+1]=-1,vis[(xx+yy+jw)%n]=0; } }
int main(){ memset(ans,-1,sizeof(ans)); scanf("%d",&n); scanf("%s%s%s",a+1,b+1,c+1); dfs(n,0); …

回复

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

正在加载回复...