题目描述
读入的数据最后面有字符串,所以对输入的len进行调整
将输入的字符串等式右边全部移到等式左边,将每一个整数拆分成(a,p)表达,则分别对每一个数字进行操作
枚举每一个数字取出每一根,然后放入某一个数字(前提是可以取,放的位置之前没有)
通过pair<int,int> 存储每一个数字的(a,p)值和权值 a存储对应数字的状态表示(打表,仪表盘表示)
算法1
C++ 代码
#include<iostream>
#include<cstring>
#include<bitset>
#include<vector>
using namespace std;
const int N=1010;
typedef pair<int,int> PII;
//记录a的大小
int tot=0;
string str;
const int num[10]={//对应10个数字
0b1111011,
0b1001000,
0b0111101,
0b1101101,
0b1001110,
0b1100111,
0b1110111,
0b1001001,
0b1111111,
0b1101111
};
//将每一个整数存储为对应位上的数字和权值
PII a[N];
bool flag=false;
int len;
int get_num(int u){
// cout<<"u="<<u<<endl;
for(int i=0;i<10;i++){
if(u==num[i]){
return i;
}
}
}
bool check(int i,int j){
if((a[i].first>>j&1)!=0){
return true;
}
return false;
}
bool check_u(int u){
for(int i=0;i<10;i++){
if(a[u].first==num[i]){
return true;
}
}
return false;
}
bool check_t(){
int sum=0;
for(int i=1;i<=tot;i++){
if(!check_u(i)){
return false;
}
// cout<<a[i].first<<" "<<a[i].second<<endl;
sum+=(get_num(a[i].first))*(a[i].second); //输入数据严格符合逻辑
}
// cout<<"sum="<<sum<<endl;
return sum==0;
}
void work(){
//枚举每一个数字的每一个位置上,总共tot个数字 7个位置
for(int i=1;i<=tot;i++){
for(int j=0;j<7;j++){//将该位置的取出
if(check(i,j)){ //选判断第i个数字的第j是否有
for(int p=1;p<=tot;p++){
for(int q=0;q<7;q++){
if(!check(p,q)){ //a[p]的第q个位置没有,可以放
// cout<<a[i].first<<" "<<a[p].first<<endl;
// cout<<get_num(a[i].first)<<" "<<get_num(a[p].first)<<endl;
// cout<<num[get_num(a[i].first)]<<" "<<num[get_num(a[p].first)]<<endl;
// cout<<"i="<<i<<"j="<<j<<endl;
// cout<<"p="<<p<<"q="<<q<<endl;
// a[i].first^=(1<<j);
a[i].first=a[i].first^(1<<j);
a[p].first^=(1<<q);
// cout<<a[i].first<<endl;
// cout<<get_num(a[i].first)<<" "<<get_num(a[p].first)<<endl;
// cout<<num[get_num(a[i].first)]<<" "<<num[get_num(a[p].first)]<<endl;
//如果存在一种方案,输出
if(check_t()){
int p=tot;
flag=true;
//a[]从右往左进行输出
// for(int i=1;i<=tot;i++){
// cout<<a[i].first<<" "<<a[i].second<<endl;
// cout<<get_num(a[i].first)<<" "<<a[i].second<<endl;
// }
for(int i=0;i<=len;i++){
if(str[i]>='0'&&str[i]<='9'){
// cout<<(char)(get_num(a[p--].first));
// cout<<a[p].first<<endl;
cout<<get_num(a[p--].first);
}else{
cout<<str[i];
}
}
return ;
}
//恢复
a[i].first^=(1<<j);
a[p].first^=(1<<q);
}
}
}
}
}
}
cout<<"No"<<endl;
}
int main(){
//对输入字符串进行处理
cin>>str;
//首先找到分割左右的等号
len=str.find("#",0);
int eq=str.find("=",0);
//将右边的式子处理到等式的左边
for(int i=len-1,j;i>eq;i=j-1){
// cout<<str[i]<<endl;
//j指向该数字的左边界
j=i;
while(str[j-1]>='0'&&str[j-1]<='9'){j--;}
int type=-1;
if(str[j-1]=='-'){type=1;}//判断正负
//将该对应的数字通过存入a
for(int k=i;k>=j;k--){
int w=1;
for(int j=1;j<=(i-k);j++){
w*=10;
}
a[++tot]={num[str[k]-'0'],type*w};
}
// cout<<str[i]<<" "<<str[j]<<endl;
//找到下一个数的位置
if(str[j-1]=='+'||str[j-1]=='-'){
j--;//防止左边为=
}
}
//处理左边的部分,基本与右边一样
for(int i=eq-1,j;i>=0;i=j-1){
j=i;
while(str[j-1]>='0'&&str[j-1]<='9'){j--;}
int type=1;
if(str[j-1]=='-'){type=-1;}//判断正负
//将该对应的数字通过存入a
for(int k=i;k>=j;k--){
int w=1;
for(int j=1;j<=(i-k);j++){
w*=10;
}
a[++tot]={num[str[k]-'0'],type*w};
}
// cout<<str[i]<<" "<<str[j]<<endl;
//找到下一个数的位置
if(str[j-1]=='+'||str[j-1]=='-'){
j--;//防止左边为=
}
}
// for(int i=1;i<=tot;i++){
// cout<<get_num(a[i].first)<<" "<<a[i].second<<endl;
// }
work();
return 0;
}