【Luogu】P1013进制位(搜索)

题目链接在这里

这题和虫食算比较类似。做完这道题可以去做虫食算。都是搜索一类的题。

这样  我们分析题目可以发现进制只可能是字母的个数,也就是n-1。为什么?

因为题目要求完整的加法表才算数。如果进制低于n-1,字母就多了;如果进制高,字母就不够,凑不出一个完整的加法表。所以这题第二问比第一问简单很多。

再说第一问。可以使用搜索,dfs参数是已经搜的字符个数,如果等于n-1判断是否合法,合法就可以输出答案退出程序,不合法就继续搜。在dfs的时候可以枚举有哪些字符是没用过的,再枚举哪些数字是没用过的,一一对应。数据范围很小,可以轻松搞定。

#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;
}
时间: 2024-10-25 21:14:22

【Luogu】P1013进制位(搜索)的相关文章

洛谷P1013 进制位

P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + 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同学为本

noip 1998 洛谷P1013 进制位

题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: 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同学为本题新加一组数据 输入输出

洛谷P1013 进制位 数论

首先我们可以发现一个有趣的性质,就是1一定要有,因为有进位就一定会有一嘛,额,其实我也不会证,题解上说一定是连续的几个数,且一定会包含一根据这个条件,我们可以发现如果只算那些只由一个字母构成的,我们可以发现,一个字母如果出现n次,那么其表示的数就是 n-1 那么如何判断不可行呢,如果有一个字母出现次数为 0 则表示其不可行 #include <cstdio> #include <cmath> #include <cstdlib> #include <cstring

【学习ios之路:C语言】进制.位运算.栈

1.进制转换 1).10进制转为N进制.方法:(连除倒取余). 2).N进制转换为10进制.方法:(按权求和法):当前位上的数乘以基数的位数减1次方. 例: 0b1111 ---- 1* 2^3 + 1*2^2 +1 * 2^1 +1*2^0 = 15; 038 ----- 3*16^1 +8*16^0 = 56; 3).N进制转换N进制. 例如: 二进制 --- 16进制 1010   0011  ----  A 3 1111   0011  ----  F 3 int a = 010;//8

luogu P1017 进制转换

感觉这个题 是真的恶心 本来单纯就递归写,发现好难 后来用数组记录 然后考虑 指数为 奇和偶数 分别 <0 和 > 进制的情况 其实 用进制数为3 大概讨论四种情况就可以了 由于最近就是在划水,就随便写了写代码 也没好好修改,大概过了 #include<bits/stdc++.h> using namespace std; int s[100]; int f(int n,int k) { int t =0; while (n) { s[t++] = n%k; n/=k; } ret

c语言2进制 位运算 应用

/*写函数: unsigned int  reverse_bit(unsigned int value); 这个函数的返回 值value的二进制位模式从左到右翻转后的值. 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回:           2550136832*/ #include<stdio.h> unsigned

进制、位运算笔记

进制 位运算 进制介绍 一种计数的方式,数值的表示形式. 常见的进制有:二进制.十进制.八进制和十六进制. 二进制: 0和1,C语言中表示0b开头或者0B开头. 八进制: 0,1,2,3,4,5,6,7 C语言中以0开头的数字,例如045 十进制: 自然数 十六进制: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F C语言中以0x或者0X开头的数字 进制之间的转换: 其他进制转换成十进制的三要素: 1. 数位:数码在一个数中所处的位置. 一个序列,从右往左数位依次是0,1,2,3

C语言之进制

进制 一种计数的方式.侧重点在于计数的时候是逢多少进一. 1)      C语言可以识别的进制 二进制 每一位. 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 在C语言中,写一个二进制的数的方式就是在前面加一个 0b或者0B的前缀,二进制每一位是0或者1,逢2进1; 2. 八进制 每一位. 0 1 2 3 4 5 6 7 10 11 在C语言中,写一个八进制的数的方式就是在前面加一个 0的前缀,逢8进1; %o    将整型变量中得数据以八进制的形式输出 3. 十进制

进制进制进制~转换

从刚学计算机器就对进制转换有着莫名的反感,2进制 8进制 10进制 16进制各种转换. 下面就说下逻辑地址转换成物理地址的求法吧 首先,用户输入一个16进制的数字cin>>hex>>logic_add;   hex的意思是告诉计算机输入的数是以16进制方式输入的 这个时候你要是输出cout<<logic_add;  你会发现输出的是把这个16进制的数转换为10进制以后输出的结果 cout<<hext<<logic_add;这样输出的才是16进制.