题目描述

著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:

+    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=L,L+K=K,L+V=V,L+E=E

K+L=K,K+K=V,K+V=E,K+E=KL

…… E+E=KV

根据这些规则可推导出:L=0,K=1,V=2,E=3

同时可以确定该表表示的是4进制加法

//感谢lxylxy123456同学为本题新加一组数据

输入输出格式

输入格式:

n(n≤9)表示行数。

以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)

输出格式:

① 各个字母表示什么数,格式如:L=0,K=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

题解

这道题作为洛谷第一页的题,好久放在这里都尝试过【代码能力极差= =】

好吧仔细想想还是很简单的【都没怎么剪枝就 0ms】
作为一个加法表,理应包含该进制下所有的数字【不然相加的结果会冒出别的字母出来】

这样我们可以知道这是在n进制下的加法【这里n指字母个数】
既然一定有一个0,我们就可以直接找出那一行都是原数的就是0
其它的就dfs尝试给它赋予一个数字,通过该行的加法表用已知的检查是否合法

搜到n + 1就算出来啦

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<cctype>
#include<algorithm>
#define REP(i,n) for (int i = 1; i <= (n); i++)
using namespace std;
const int maxn = 13,maxm = 105,INF = 1000000000; map<char,int> Id;
int n,siz = 0,num[maxn];
bool used[maxn];
char names[maxn]; inline char RC(){
char c = getchar();
while (!isalpha(c) && c != '+') c = getchar();
return c;
} inline int code(char c){
if (!Id.count(c)){Id[c] = ++siz; names[siz] = c;}
return Id[c];
} struct Num{
int s[maxn],len; Num() {memset(s,0,sizeof(s)); len = 0;} bool iscal(){
REP(i,len) if (num[s[i]] == -1) return false;
return true;
} int getn(){
int ans = 0;
for (int i = 1; i <= len; i++) ans = ans * n + num[s[i]];
return ans;
} void getR(){
char c = getchar();
while (!isalpha(c)) c = getchar();
while (isalpha(c)){s[++len] = code(c); c = getchar();}
}
}sum[maxn][maxn]; void init(){
fill(num,num + maxn,-1);
scanf("%d",&n); n--;
int u; RC();
REP(i,n) code(RC());
REP(i,n){
u = code(RC());
REP(j,n) sum[u][j].getR();
}
bool flag = true;
REP(i,n){
flag = true;
REP(j,n) if (sum[i][j].len != 1 || sum[i][j].s[1] != j) {flag = false; break;}
if (flag){num[i] = 0; break;}
}
if (!flag){cout<<"ERROR!"<<endl;exit(0);}
} bool check(int u){
REP(i,n) if (num[i] != -1 && sum[u][i].iscal() && num[u] + num[i] != sum[u][i].getn())
return false;
return true;
} void dfs(int u){
if (u > n){
printf("%c=%d",names[1],num[1]);
for (int i = 2; i <= n; i++)
printf(" %c=%d",names[i],num[i]);
printf("\n%d\n",n);
exit(0);
}
if (num[u] != -1) dfs(u + 1);
else {
for (int i = 1; i < n; i++){
if (!used[i]){
num[u] = i;
if (check(u)) dfs(u + 1);
num[u] = -1;
}
}
}
} int main()
{
init();
dfs(1);
cout<<"ERROR!"<<endl;
return 0;
}

洛谷 P1013 进制位 【搜索 + 进制运算】的更多相关文章

  1. 洛谷P1013 进制位

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

  2. 洛谷 P1013 进制位

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

  3. 和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS

    关于bfs: 你怎么会连这个都不知道!!!自己好好谷歌一下!!!(其实我也刚学) bfs伪代码: while(队列非空){ 取出队首元素u; 弹出队首元素; u染色为黑色; for(int i=0;i ...

  4. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  5. 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)

    洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...

  6. 和小哥哥一起刷洛谷(5) 图论之深度优先搜索DFS

    关于dfs dfs伪代码: void dfs(s){ for(int i=0;i<s的出度;i++){ if(used[i]为真) continue; used[i]=1; dfs(i); } ...

  7. noip 1998 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  8. [NOIP1998] 提高组 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  9. [洛谷 P1013] NOIP1998 提高组 进制位

    问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

随机推荐

  1. 【转】查看mysql表结构和表创建语句的方法

    转自:http://blog.csdn.net/business122/article/details/7531291 查看mysql表结构的方法有三种: 1.desc tablename; 例如: ...

  2. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)

    强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...

  3. 「日常训练」Magic Stones(CodeForces-1110E)

    题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)​成\(c_{i+1}+c_{i-1}-c_i\)​,问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...

  4. Python列表推导式和嵌套的列表推导式

    列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...

  5. Python教程 深入条件控制

    while 和 if 条件句中可以使用任意操作,而不仅仅是比较操作. 比较操作符 in 和 not in 校验一个值是否在(或不在)一个序列里.操作符 is 和 is not 比较两个对象是不是同一个 ...

  6. AsciiPic Java视频转成字符画

    AsciiPic Java视频转成字符画 github下载 https://github.com/dejavudwh/AsciiPic 运行截图 //没有做GUI 比较简陋 节省时间 main里的文件 ...

  7. 排序(C语言实现)

    读数据结构与算法分析 插入排序 核心:利用的是从位置0到位置P都是已排序的 所以从位置1开始排序,如果当前位置不对,则和前面元素反复交换重新排序 实现 void InsertionSort(Eleme ...

  8. phpcms v9手机站不支持组图($pictureurls)的修改

    phpcms v9自带的手机门户网站,有时候我们需要用到组图功能$pictureurls,我在做的时候发现,如果$pictureurls中只有一张图片会正常显示,但是如果有两张或两张以上的图片的时候, ...

  9. shell基础 -- grep、sed、awk命令简介

    在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...

  10. Phonegap 环境配置

    目前要开发 Web App 还是有比较多的选择的 如 Phonegap.MUI.AppCan,接下来以 Web前端开发工程师 的角度来一个 Phonegap 的 First Blood 一.开发环境: ...