題目描述
著名科學家盧斯為了檢查學生對進位制的理解,他給出了如下的一張加法表,表中的字母代表數字, 例如:
- L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
其含義為:
L+L=LL+L=L,L+K=KL+K=K,L+V=VL+V=V,L+E=EL+E=E
K+L=KK+L=K,K+K=VK+K=V,K+V=EK+V=E,K+E=KLK+E=KL
…… E+E=KVE+E=KV
根據這些規則可推匯出:L=0L=0,K=1K=1,V=2V=2,E=3E=3
同時可以確定該表表示的是4進制加法
//感謝lxylxy123456同學為本題新加一組資料
輸入格式
nn (n≤9)(n≤9)表示行數,
以下nn行,每行包括nn個字串,每個字串間用空格隔開,(字串僅有一個為‘+’號,其它都由大寫字母組成)
輸出格式
① 各個字母表示什么數,格式如:L=0L=0,K=1K=1,……按給出的字母順序,
② 加法運算是幾進制的,
③ 若不可能組成加法表,則應輸出“ERROR!”
輸入輸出樣例
輸入 #1復制
5
- L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
輸出 #1復制
L=0 K=1 V=2 E=3
4
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<map>
using namespace std;
int Map[2000],jd[2000];
int n;
char s[200];
char mp[100][100][20];
char que[100];
bool vis[100];
bool Check(){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
char a=jd[que[i]],b=jd[que[j]];
int c=0;
for(int k=0;k<strlen(mp[i][j]);++k){
c=c*n+jd[mp[i][j][k]];
}
if(a+b!=c)return 0;
}
}
return 1;
}
void dfs(int deep){
if(deep==n){
if(!Check()){
return;
}
for(int i=1;i<=n;++i) printf("%c=%d ",que[i],jd[que[i]]);
printf("\n");
printf("%d",n);
exit(0);
}
for(int i=0;i<n;++i){
if(!vis[i]){
for(int j=1;j<=n;j++){
if(jd[que[j]]==-1){
vis[i]=1;
jd[que[j]]=i;
dfs(deep+1);
vis[i]=0;
jd[que[j]]=-1;
}
}
}
}
}
int main(){
cin>>n;
n--;
scanf("%s",s);
for(int i=1;i<=n;++i){
scanf("%s",s);
Map[s[0]]=i;
que[i]=s[0];
jd[s[0]]=-1;
}
for(int i=1;i<=n;++i){
scanf("%s",s);
char ch=s[0];
for(int j=1;j<=n;++j){
scanf("%s",s);
for(int k=0;k<strlen(s);++k)
mp[Map[ch]][j][k]=s[k];
}
}
dfs(0);
printf("ERROR!");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155877.html
標籤:其他
下一篇:P1014 Cantor表
