https://www.luogu.org/problem/show?pid=1013#sub
这个题的关键;
首先,不可能输入只有个位数
因为两个非零个位数相加答案是一个新的个位数;
既然有两位数,那么1一定存在;
既然1一定存在,那么2一定存在;
以此类推,最后会发现空一个数,就是0;
所以进制一定是确定的;
直接全排列暴搜走起
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstdio>
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;i<n;i++)
for(int j=1;j<n;j++)
if(v[i]+v[j]!=find(i,j))return 0;
return 1;
}
void out(){
for(int i=1;i<n;i++)printf("%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;i<n;i++)if(v[i]==-1)v[i]=k,dfs(k+1),v[i]=-1;
}
int main()
{
scanf("%d",&n);
cin>>cc;
for(int i=1;i<n;i++){
cin>>cc;
F[cc]=i;c[i]=cc;
}
for(int i=1;i<n;i++){
cin>>cc;
for(int j=1;j<n;j++){
scanf("%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!"<<endl;
}