• 洛谷—— P1092 虫食算


    https://www.luogu.org/problem/show?pid=1092

    题目描述

    所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

    http://paste.ubuntu.com/25448822/

    其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。

    现在,我们对问题做两个限制:

    首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。

    其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。

    http://paste.ubuntu.com/25448824/

    上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解

    输入输出格式

    输入格式:

    包含四行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

    输出格式:

    包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

    输入输出样例

    输入样例#1:
    5
    ABCED
    BDACE
    EBBAA
    
    输出样例#1:
    1 0 3 4 2
    

    说明

    对于30%的数据,保证有N<=10;

    对于50%的数据,保证有N<=15;

    对于全部的数据,保证有N<=26。

    noip2004提高组第4题

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <vector>
     5 
     6 const int N(27);
     7 bool vis[2333],use[2333];
     8 char a[N],b[N],c[N];
     9 int n,ans[2333],len;
    10 std::vector<int>tmp;
    11 
    12 bool check()
    13 {
    14     int tt=0,i; bool if_=0;
    15     for(i=n-1; i>=0; --i)
    16     {
    17         char ca=a[i],cb=b[i],cc=c[i];
    18         if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0)
    19         {
    20             if_=1;
    21             break;
    22         }
    23         tt+=ans[ca]+ans[cb];
    24         if(tt%n!=ans[cc]) return false;
    25         tt/=n;
    26     }
    27     return true;
    28 }
    29 void DFS(int x)
    30 {
    31     if(x==len)
    32     {
    33         for(char ch='A'; ch<'A'+len; ++ch)
    34             printf("%d ",ans[ch]);
    35         std::exit(0);
    36     }
    37     char ch=tmp[x];
    38     for(int i=0; i<n; ++i)
    39     {
    40         if(use[i]) continue;
    41         use[i]=1; ans[ch]=i;
    42         if(check()) DFS(x+1);
    43         use[i]=0; ans[ch]=-1;
    44     }
    45 }
    46 
    47 int Presist()
    48 {
    49     scanf("%d%s%s%s",&n,a,b,c);
    50     for(int i=n-1; i>=0; --i)
    51     {
    52         if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]);
    53         if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]);
    54         if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]);
    55     }
    56     len=tmp.size();
    57     memset(ans,-1,sizeof(ans));
    58     DFS(0);
    59     return 0;
    60 }
    61 
    62 int Aptal=Presist();
    63 int main(){;}
    从0--n-1填数,TLE3个,70分
     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <vector>
     5 
     6 const int N(27);
     7 bool vis[2333],use[2333];
     8 char a[N],b[N],c[N];
     9 int n,ans[2333],len;
    10 std::vector<int>tmp;
    11 
    12 bool check()
    13 {
    14     int tt=0,i; bool if_=0;
    15     for(i=n-1; i>=0; --i)
    16     {
    17         char ca=a[i],cb=b[i],cc=c[i];
    18         if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0)
    19         {
    20             if_=1;
    21             break;
    22         }
    23         tt+=ans[ca]+ans[cb];
    24         if(tt%n!=ans[cc]) return false;
    25         tt/=n;
    26     }    /*if(if_)
    27     for(; i--; )
    28     {
    29         char ca=a[i],cb=b[i],cc=c[i];
    30         if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) continue;
    31         if((ans[ca]+ans[cb])%n!=ans[cc] && (ans[ca]+ans[cb]+1)%n!=ans[cc]) return false;
    32     }*/
    33     return true;
    34 }
    35 void DFS(int x)
    36 {
    37     if(x==len)
    38     {
    39         for(char ch='A'; ch<'A'+len; ++ch)
    40             printf("%d ",ans[ch]);
    41         std::exit(0);
    42     }
    43     char ch=tmp[x];
    44     for(int i=n-1; i>=0; --i)
    45     {
    46         if(use[i]) continue;
    47         use[i]=1; ans[ch]=i;
    48         if(check()) DFS(x+1);
    49         use[i]=0; ans[ch]=-1;
    50     }
    51 }
    52 
    53 int Presist()
    54 {
    55     scanf("%d%s%s%s",&n,a,b,c);
    56     for(int i=n-1; i>=0; --i)
    57     {
    58         if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]);
    59         if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]);
    60         if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]);
    61     }
    62     len=tmp.size();
    63     memset(ans,-1,sizeof(ans));
    64     DFS(0);
    65     return 0;
    66 }
    67 
    68 int Aptal=Presist();
    69 int main(){;}
    从n-1--0填数,TLE1个,90分
     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <vector>
     5 
     6 const int N(27);
     7 bool vis[2333],use[2333];
     8 char a[N],b[N],c[N];
     9 int n,ans[2333],len;
    10 std::vector<int>tmp;
    11 
    12 bool check()
    13 {
    14     int tt=0,i; bool if_=0;
    15     for(i=n-1; i>=0; --i)
    16     {
    17         char ca=a[i],cb=b[i],cc=c[i];
    18         if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0)
    19         {
    20             if_=1;
    21             break;
    22         }
    23         tt+=ans[ca]+ans[cb];
    24         if(tt%n!=ans[cc]) return false;
    25         tt/=n;
    26     }    if(if_)
    27     for(; i--; )
    28     {
    29         char ca=a[i],cb=b[i],cc=c[i];
    30         if(ans[ca]<0 ||ans[cb]<0 ||ans[cc]<0) continue;
    31         if((ans[ca]+ans[cb])%n!=ans[cc] && (ans[ca]+ans[cb]+1)%n!=ans[cc]) return false;
    32     }
    33     return true;
    34 }
    35 void DFS(int x)
    36 {
    37     if(x==len)
    38     {
    39         for(char ch='A'; ch<'A'+len; ++ch)
    40             printf("%d ",ans[ch]);
    41         std::exit(0);
    42     }
    43     char ch=tmp[x];
    44     for(int i=n-1; i>=0; --i)
    45     {
    46         if(use[i]) continue;
    47         use[i]=1; ans[ch]=i;
    48         if(check()) DFS(x+1);
    49         use[i]=0; ans[ch]=-1;
    50     }
    51 }
    52 
    53 int Presist()
    54 {
    55     scanf("%d%s%s%s",&n,a,b,c);
    56     for(int i=n-1; i>=0; --i)
    57     {
    58         if(!vis[a[i]]) vis[a[i]]=1,tmp.push_back(a[i]);
    59         if(!vis[b[i]]) vis[b[i]]=1,tmp.push_back(b[i]);
    60         if(!vis[c[i]]) vis[c[i]]=1,tmp.push_back(c[i]);
    61     }
    62     len=tmp.size();
    63     memset(ans,-1,sizeof(ans));
    64     DFS(0);
    65     return 0;
    66 }
    67 
    68 int Aptal=Presist();
    69 int main(){;}
    AC 增加有效剪枝,每次判断位置进位情况,判断DFS是否可行
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Model、ModelMap和ModelAndView的使用详解
    maven的pom.xml配置json依赖
    int和Integer的区别
    SSM 视频
    2018-1-25 PHP数组
    2018-1-25 PHP函数方法
    2018-1-22 PHP 变量和常量
    2018-1-21 复习
    2018-1-18 如何用html和css实现div的缓慢移动效果
    2018-1-17 js弹出div登录窗口
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7543230.html
Copyright © 2020-2023  润新知