【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;
}

 

转载于:https://www.cnblogs.com/cellular-automaton/p/7467401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值