P1092 [NOIP2004 提高组] 虫食算

给定的进制n,枚举各个字母代表的数字

->从右往左搜索 + 便搜遍判断

->dep==n+1 判断+输出

->dfs 时 低位的数字较大

>>>dfs 顺序+剪芝

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;

int n,used[100],ans[100],p[100],tmp_use[100],cnt=0;
char a[100],b[100],c[100];

int ok2()
{
    for(int i=n;i>=1;i--)
    {
        if(ans[a[i]-'A'+1]==-1 ||ans[b[i]-'A'+1]==-1||ans[c[i]-'A'+1]==-1) continue;
        if( (ans[a[i]-'A'+1]+ans[b[i]-'A'+1]) %n != ans[c[i]-'A'+1] && (ans[a[i]-'A'+1]+ans[b[i]-'A'+1]+1 )%n != ans[c[i]-'A'+1]) return 0;
    }
    return 1;
}
void ok1()
{
    int jw=0;
    for(int i=n;i>=1;i--)
    {
        int s=ans[a[i]-'A'+1]+ans[b[i]-'A'+1]+jw;
        if(s%n!=ans[c[i]-'A'+1]) return;
        jw=s/n;
    }
    for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
    cout<<endl;
    exit(0);
}
void dfs(int dep)
{
    if(dep>=n+1)
    {
        //ddd
        ok1();
        return;
    }
    for(int i=n-1;i>=0;i--) //高位 数值较低
    {
        if(used[i]) continue;
        ans[p[dep]]=i; used[i]=1;
        if(ok2())
        {
            dfs(dep+1);
            ans[p[dep]]=-1; used[i]=0;
        }
        else used[i]=0,ans[p[dep]]=-1;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    memset(ans,-1,sizeof(ans));
    
    cin>>n;
    cin>>a+1>>b+1>>c+1;
//    cout<<a+1<<endl;
    
    for(int i=n;i>=1;i--)
    {
        if(tmp_use[a[i]-'A'+1]==0) p[++cnt]=a[i]-'A'+1,tmp_use[a[i]-'A'+1]=1;
        if(tmp_use[b[i]-'A'+1]==0) p[++cnt]=b[i]-'A'+1,tmp_use[b[i]-'A'+1]=1;
        if(tmp_use[c[i]-'A'+1]==0) p[++cnt]=c[i]-'A'+1,tmp_use[c[i]-'A'+1]=1;
    }
    dfs(1);
    return 0;
}
View Code

 

posted @ 2023-07-19 13:54  JMXZ  阅读(16)  评论(0)    收藏  举报