Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Submit Status
Problem Description
小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本《AC is not a dream》杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为0,但是有一些数字被隐藏掉了,然后让你根据没有隐藏的数字填出隐藏的数字。
如下图:
然后小晴天二话不说,三下五除二就写出了答案:
然后小晴天就觉得这样的题目太简单了,于是问你是否有办法来求出一道题目有多少种不同的答案呢?(只要有一个方框有不同的数字即为不同的答案)
Input
多组数据,首先是一个整数t(t<=20),表示数据组数。
对于每组数据,用5行表示一个竖式,每行均为一个字符串,仅含有星号(*)与数字('0'~'9')组成,其中星号表示空白
其中第一行为长度为3的字符串。
第二行为长度为2的字符串。
第三行为长度为4的字符串。
第四行为长度为3的字符串。
第五行为长度为5的字符串。
Output
对于每组数据,输出一个整数x,表示符合乘法竖式法则的填法的种类。
Sample Input
2 *** ** 3384 846 ***** 4** ** 3384 846 *****
Sample Output
2 1
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <string.h> 6 using namespace std; 7 #define lenstr 7 8 char s1[lenstr],s2[lenstr],s3[lenstr],s4[lenstr],s5[lenstr]; 9 /** 10 鉴于乘数内含有变量,我将每个都取出来,然后做到乘数内不变的数不变。 11 起先使用标记,后面发现标记后的东西只能用一次。(过了当前循环就不能用了) 12 后面改用上下限,就可以做到不变的量不变。 13 感谢鑫哥。 14 */ 15 int main() 16 { 17 int t,cou; 18 scanf("%d",&t); 19 getchar(); 20 while(t--) 21 { 22 cou=0; 23 gets(s1); 24 gets(s2); 25 gets(s3); 26 gets(s4); 27 gets(s5); 28 int min1=1,max1=9; 29 if(s1[0]!='*') {min1=max1=s1[0]-'0';} 30 for(int a=min1;a<=max1; a++) 31 { 32 int min2=0,max2=9; 33 if(s1[1]!='*') {min2=max2=s1[1]-'0';} 34 35 for(int b=min2; b<=max2; b++) 36 { 37 int min3=0,max3=9; 38 if(s1[2]!='*') {min3=max3=s1[2]-'0';} 39 40 for(int c=min3; c<=max3; c++) 41 { 42 int min4=1,max4=9; 43 if(s2[0]!='*') {min4=max4=s2[0]-'0';} 44 45 for(int d=min4; d<=max4; d++) 46 { 47 int min5=0,max5=9; 48 if(s2[1]!='*') min5=max5=s2[1]-'0'; 49 50 for(int e=min5; e<=max5; e++) 51 { 52 int num1=a*100+b*10+c; 53 int num2=d*10+e; 54 int temp1=num1*e; 55 int temp2=num1*d; 56 int temp3=num1*num2; 57 char s[10],ss[10],sss[10]; 58 59 sprintf(s,"%d",temp1); 60 int len=strlen(s); 61 if(len!=4) continue; 62 int flag=0; 63 for(int i=0; i<len; i++) 64 { 65 if(s3[i]=='*') continue; 66 else if(s3[i]!=s[i]) 67 { 68 flag=1; 69 break; 70 } 71 } 72 if(flag) continue; 73 74 sprintf(ss,"%d",temp2); 75 len=strlen(ss); 76 if(len!=3) continue; 77 for(int i=0; i<len; i++) 78 { 79 if(s4[i]=='*') continue; 80 else if(s4[i]!=ss[i]) 81 { 82 flag=1; 83 break; 84 } 85 } 86 if(flag) continue; 87 88 sprintf(sss,"%d",temp3); 89 len=strlen(sss); 90 if(len!=5) continue; 91 for(int i=0; i<len; i++) 92 { 93 if(s5[i]=='*') continue; 94 else if(s5[i]!=sss[i]) {flag=1;break;} 95 } 96 if(flag) continue; 97 //printf("%d %d %d %d %d %d %d %d %d %d ",a,b,c,d,e,num1,num2,temp1,temp2,temp3); 98 cou++; 99 } 100 } 101 } 102 } 103 } 104 printf("%d ",cou); 105 } 106 return 0; 107 }