把今天讲的题解贴出来吧(进制位)

ZZQ  •  2年前


源代码如下:

#include<bits/stdc++.h>
using namespace std;

map<char,int>m;
char a[10],ch;
int n,p[10];//p:产生组合数
string str[10][10];//存储加法标

bool Check()//判断是否成立函数
{
  for(int i=0; i<n-1; i++)//枚举
    for(int j=i; j<n-1; j++)
    {
      int x=p[i],y=p[j],z=0;//产生新组合
      //16~19 判断
      for(int k=0; k<str[i][j].size(); k++)
        z=z*(n-1)+p[m[str[i][j][k]]];
      if(z!=x+y)
        return false;
    }
  return true;
}

int main()
{	
  for(int i=0; i<10; i++)//产生初始数字和,初始化p
    p[i]=i;
  cin>>n>>ch;//输入n,ch
  for(int i=0; i<n-1; i++)
    cin>>a[i],m[a[i]]=i;//读入行数,顺便映射
  for(int i=0; i<n-1; i++)
  {
    cin>>ch;
    for(int j=0; j<n-1; j++)
      cin>>str[i][j];//读入数据
  }
  //没有成立或还能产生下一个组合,注意有分号,表示这是一条单独的语句
  while(!Check()&&next_permutation(p,p+n-1));
  if(Check())//如果成立,输出答案
  {
    for(int i=0; i<n-1; i++)//输出
      cout<<a[i]<<"="<<p[m[a[i]]]<<(i==n-2?'\n':' ');
    cout<<n-1<<'\n';
  }
  else//如果没有解
    cout<<"ERROR!\n";
  return 0;
}

评论: