博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
习题 7-8 数字谜(Digit Puzzle, ACM/ICPC Xi‘an 2006, UVa12107)
阅读量:298 次
发布时间:2019-03-03

本文共 1780 字,大约阅读时间需要 5 分钟。

原题链接:

分类:迭代剪枝
备注:IDA*,细节

枚举两个乘数,匹配乘积,还是很快的,就100ms。

#include
using 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/

你可能感兴趣的文章