本文共 1780 字,大约阅读时间需要 5 分钟。
原题链接:
分类:迭代剪枝 备注:IDA*,细节枚举两个乘数,匹配乘积,还是很快的,就100ms。
#includeusing namespace std;const char s[]="*0123456789";char str[3][10];int len[3],kase;bool vis[100][100];int cal(){ int num[3]={ 0}; for(int i=0;i<2;i++) for(int j=0;j =0;i--){ int t1=num[2]%10; num[2]/=10; if(str[2][i]=='*')continue; if(t1!=str[2][i]-'0')return 0; } return 1;}int check(int id,int pos){ if(id==2) return cal(); int nxt_id=pos==len[id]-1?id+1:id; int nxt_pos=nxt_id==id+1?0:pos+1; if(str[id][pos]!='*')return check(nxt_id,nxt_pos); int st=pos==0?2:1,res=0; char tmp=str[id][pos]; for(int i=st;i<11;i++){ if(!isdigit(s[i]))continue; str[id][pos]=s[i]; res+=check(nxt_id,nxt_pos); if(res>1)break; } str[id][pos]=tmp; return res;}bool idastar(int id,int pos,int now,int maxd){ if(now==maxd) return check(0,0)==1?true:false; if(id==3)return false; int nxt_id=pos==len[id]-1?id+1:id; int nxt_pos=nxt_id==id+1?0:pos+1; char tmp=str[id][pos]; for(int i=0;i<11;i++){ if(pos==0&&i==1)continue; bool flg=false; str[id][pos]=s[i]; if(s[i]==tmp) flg=idastar(nxt_id,nxt_pos,now,maxd); else flg=idastar(nxt_id,nxt_pos,now+1,maxd); if(flg)return true; } str[id][pos]=tmp; return false;}int main(void){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%s",str[0])){ if((len[0]=strlen(str[0]))==1&&str[0][0]=='0')break; scanf("%s %s",str[1],str[2]); len[1]=strlen(str[1]),len[2]=strlen(str[2]); int maxd=0; while(!idastar(0,0,0,maxd))maxd++; printf("Case %d: ",++kase); for(int i=0;i<3;i++){ for(int j=0;j
转载地址:http://opel.baihongyu.com/