湖南第一师范原创题,比较好玩.

E- Seven tombs

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 31   Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size:  

Problem Description

塔.拉夏被埋葬在术士峡谷的七个古墓中的一个。
塔.拉夏的古墓一共有七种不同的符号,分别用A、B、C、D、E、F、G表示。每个古墓中分别封印着一种力量,用1、2、3、4、5、6、7表示。为了防止以后有人取得这些力量,赫拉迪姆将这些对应的关系全部隐藏起来了。
为了获得这七种力量,你终于找到了一点线索:一个古代赫拉迪姆留下的式子。这个式子表示了七种力量对应的关系。经过破译,终于知道将七种符号所表示的力量的代号分别代进式子中,使得等式成立的,就是开启封印的钥匙。
写一个程序解开这个迷题。

Input

一行一个字符串,为一个只有变量A..G的等式。式子中只含有字母、加、减、乘号以及括号和一个等号,并且“ABC”表示A*100+B*10+C,字符串长度不超过100。

Output

一行,输出对应等式的解。如果有多种可能,输出ABCDEFG表示十进制数最小的一个。输入数据保证有解。

Sample Input

(A+B)*C-E*(C+D)=FF

Sample Output

(2+6)*7-1*(7+5)=44

Author

hnfnu


枚举7^5~很好想到~效率也能接受~关键就是解析算数式~
先将括号的情况处理了~用递归的思路~~很简单~~而乘法的优先级问题~我没多想~~干脆每个乘法两侧加括号~~优先级就上来了~

Program:
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#define ll long long
using namespace std;
ll a[8],i,j,l,p,S1,S2,stack;
char s[120],str[300];
ll getnum()
{
      ll x,y,t;
      while (p<l && s[p]!='=' && s[p]!=')')
      {
            if (s[p]=='(') 
            {
                   p++;
                   x=getnum();
            }else
            if (s[p]>='A' && s[p]<='F')
            {
                   x=0;
                   while (s[p]>='A' && s[p]<='F') 
                   {
                        x=x*10+a[s[p]-'A'];         
                        p++;
                   }        
            }
            t=-1;
            if (s[p]=='+') t=0; else
            if (s[p]=='-') t=1; else
            if (s[p]=='*') t=2; else p--;
            p++;
            if (s[p]=='(') 
            {
                   p++;
                   y=getnum();
            }else
            {
                   y=0;
                   while (s[p]>='A' && s[p]<='F') 
                   {
                        y=y*10+a[s[p]-'A'];         
                        p++;
                   }   
            }
            if (t==0) x+=y; else
               if (t==1) x-=y; else
                  if (t==2) x*=y;
      }
      p++;
      return x;
}
bool judge()
{   
      p=0;
      S1=getnum();
      S2=getnum();
      if (S1==S2) return true;
      return false;
}
int main()
{
      freopen("input.txt","r",stdin);
      freopen("output.txt","w",stdout);
      gets(s);
      strcpy(str,s);
      l=strlen(s);
      i=0;
      while (1)
      {
             for (;i<l;i++)
                if (s[i]=='*') break;
             if (i==l) break;
             j=i+1;
             stack=0;
             if (s[j]=='(') stack=1;
             while (stack)
             {  
                    j++;
                    if (s[j]==')') stack--;
                    if (s[j]=='(') stack++;
             }
             j++;
             while (s[j]>='A' && s[j]<='F') j++;
             for (p=l;p>j;p--) s[p]=s[p-1];   
             s[j]=')';  
             l++;  
             j=i-1;
             stack=0;
             if (s[j]==')') stack=1;
             while (stack)
             { 
                    j--;
                    if (s[j]==')') stack++;
                    if (s[j]=='(') stack--;
             }
             while (s[j]>='A' && s[j]<='F') j--;
             j++;
             for (p=l;p>j;p--) s[p]=s[p-1];  
             s[j]='('; 
             l++;  s[l]='\0'; 
             i+=2;
      }
   //   puts(s);
      for (a[0]=1;a[0]<=7;a[0]++)
         for (a[1]=1;a[1]<=7;a[1]++)
            if (a[1]!=a[0])
            for (a[2]=1;a[2]<=7;a[2]++)
               if (a[2]!=a[1] && a[2]!=a[0])
               for (a[3]=1;a[3]<=7;a[3]++)
                  if (a[3]!=a[2] && a[3]!=a[1] && a[3]!=a[0])
                  for (a[4]=1;a[4]<=7;a[4]++)
                     if (a[4]!=a[3] && a[4]!=a[2] && a[4]!=a[1] && a[4]!=a[0])
                     for (a[5]=1;a[5]<=7;a[5]++)
                     if (a[5]!=a[4] && a[5]!=a[3] && a[5]!=a[2] && a[5]!=a[1] && a[5]!=a[0])
                        if (judge()) goto A;
      A: ;
      for (i=0;i<l;i++)
         if (str[i]>='A' && str[i]<='F') printf("%I64d",a[str[i]-'A']);
            else printf("%c",str[i]);
      printf("\n");
 //     judge();
      return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值