搜索——洛谷P1013 进制位

https://www.luogu.org/problem/show?pid=1013#sub
这个题的关键;
首先,不可能输入只有个位数
因为两个非零个位数相加答案是一个新的个位数;
既然有两位数,那么1一定存在;
既然1一定存在,那么2一定存在;
以此类推,最后会发现空一个数,就是0;
所以进制一定是确定的;
直接全排列暴搜走起

#include
#include
#include
#include
#include
#include
#include
using namespace std;
map<char,int>F;
char c[100],cc,s[100];
int a[100][100][40],v[100];
int n;
int find(int x,int y){
    int ans=v[a[x][y][1]];
    if(a[x][y][0]==2)ans=ans*(n-1)+v[a[x][y][2]];
    return ans;
}
bool check(){
    for(int i=1;ifor(int j=1;jif(v[i]+v[j]!=find(i,j))return 0;
    return 1;
}
void out(){
    for(int i=1;iprintf("%c=%d ",c[i],v[i]);
    printf("\n%d",n-1);
    exit(0);    
}
void dfs(int k){
    if(k==n-1)if(check())out();else;else;
        for(int i=1;iif(v[i]==-1)v[i]=k,dfs(k+1),v[i]=-1;
}
int main()
{
    scanf("%d",&n);
    cin>>cc;
    for(int i=1;icin>>cc;
        F[cc]=i;c[i]=cc;
    }
    for(int i=1;icin>>cc;
        for(int j=1;jscanf("%s",s+1);
            a[i][j][0]=strlen(s+1);
            for(int k=1;k<=a[i][j][0];k++)a[i][j][k]=F[s[k]];
        }
    }
    memset(v,-1,sizeof v);
    dfs(0);
    cout<<"ERROR!"<

你可能感兴趣的:(搜索)