acdream 小晴天老师系列——竖式乘法(简单穷举)

    小晴天老师系列——竖式乘法

Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)

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

Hint

样例1,除了题目中的那种情况,还有这种

而样例2,因为第一个数的百位被固定为4,故只有一种填法。

思路:第一行和第二行两个数都是比较小的,直接穷举这2个数,再将17格子的所有可能行的结果保存。根据输入17个就直接搜可行的结果匹配。注意5个数字的开头都不能为0。

  1 /*
  2 * this code is made by xcw0754
  3 * Problem: 1704
  4 * Verdict: Accepted
  5 * Submission Date: 2015-07-16 10:18:37
  6 * Time: 4MS
  7 * Memory: 36836KB
  8 */
  9 //#pragma comment(linker,"/STACK:102400000,102400000")
 10 #include <iostream>
 11 #include <stdio.h>
 12 #include <string.h>
 13 #include <vector>
 14 #include <stack>
 15 #include <algorithm>
 16 #include <map>
 17 #include <bits/stdc++.h>
 18 #define LL long long
 19 #define pii pair<int,int>
 20 #define INF 0x7f7f7f7f
 21 using namespace std;
 22 const int N=500005;
 23 int up;
 24 int s[N][18];
 25
 26
 27 void pre_cal()
 28 {
 29     up=0;
 30     for(int i=100; i<1000; i++)
 31     {
 32         for(int j=10; j<100; j++)
 33         {
 34             s[up][0]=i/100; //不能为0
 35             s[up][1]=i/10%10;
 36             s[up][2]=i%10;
 37
 38             s[up][3]=j/10;  //不能为0
 39             s[up][4]=j%10;
 40
 41             int tmp=i*(j%10);   //第3行
 42             s[up][5]=tmp/1000;  //不能为0
 43             if(!s[up][5] || s[up][5]>9)  continue;
 44             s[up][6]=tmp/100%10;
 45             s[up][7]=tmp/10%10;
 46             s[up][8]=tmp%10;
 47
 48             tmp=i*(j/10);       //第4行
 49             s[up][9]=tmp/100;   //不能为0
 50             if(!s[up][9]|| s[up][9]>9)  continue;
 51             s[up][10]=tmp/10%10;
 52             s[up][11]=tmp%10;
 53
 54             tmp=i*j;            //第5行
 55             s[up][12]=tmp/10000;//不能为0
 56             if(!s[up][12])  continue;
 57             s[up][13]=tmp/1000%10;
 58             s[up][14]=tmp/100%10;
 59             s[up][15]=tmp/10%10;
 60             s[up][16]=tmp%10;
 61             up++;
 62         }
 63     }
 64
 65 }
 66
 67 int now[18];
 68 vector<int> alk;
 69 char c[18];
 70
 71 void get_input()
 72 {
 73     memset(now,0,sizeof(now));
 74     alk.clear();
 75
 76     scanf("%s",c);
 77     scanf("%s",c+3);
 78     scanf("%s",c+5);
 79     scanf("%s",c+9);
 80     scanf("%s",c+12);
 81
 82     for(int i=0; i<17; i++)
 83         if(isdigit(c[i]))
 84         {
 85             now[i]=c[i]-‘0‘;
 86             alk.push_back(i);
 87         }
 88 }
 89
 90
 91 int cal()
 92 {
 93     int ans=0;
 94     for(int i=0; i<up; i++)
 95     {
 96         int j;
 97         for(j=0; j<alk.size(); j++) //这几个都要匹配
 98         {
 99             int k=alk[j];
100             if(now[k]!=s[i][k]) break;
101         }
102         if(j==alk.size())
103             ans++;
104     }
105     return ans;
106 }
107
108 int main()
109 {
110     //freopen("input.txt", "r", stdin);
111     pre_cal();
112     int t;
113     scanf("%d",&t);
114     while(t--)
115     {
116         get_input();
117         printf("%d\n",cal());
118     }
119     return 0;
120 }

AC代码

时间: 2024-08-16 07:49:34

acdream 小晴天老师系列——竖式乘法(简单穷举)的相关文章

[ACDream]小晴天老师系列——竖式乘法

直接上题目: 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本<AC is not a dream>杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为

【acdream】小晴天老师系列——竖式乘法

C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本<AC is not a dream>杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为0,但

acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)

小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Problem Description 小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏. 小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图告诉你了,请你帮忙设计一个最大的矩形

acdream 小晴天老师系列——苹果大丰收(DP)

小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买了N个一模一样的箱子,想要把苹果放进去,允许有的箱子是空的,请问小晴天有多少种不同的放法呢? 例如对于4个苹果,3个箱子,2+1+1和1+2+1和1+1+2 是同一种分法. Input 多组数据,首先是一个正整数t(t<=100)表示数据的组数. 每组数据均包含二个整数M和N(1<=M,N<

F - 小晴天老师系列——苹果大丰收

F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买了N个一模一样的箱子,想要把苹果放进去,允许有的箱子是空的,请问小晴天有多少种不同的放法呢? 例

D - 小晴天老师系列——晴天的后花园

D - 小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏. 小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图

G - 小晴天老师系列——可恶的墨水瓶

G - 小晴天老师系列——可恶的墨水瓶 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天老师正在备课,这时,可恶的墨水瓶突然自己打翻了!悲剧发生了!小晴天的备课稿都被墨水弄脏了.... 不过小晴天很乐观~这时他把他的一张纸分成n*m个格子,其中有一些格子被墨水涂黑了,有的没有.那么小晴天想知道,最大的一块

E - 小晴天老师系列——我有一个数列!

E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天:“我有一个数列!” 小晴天:“我还要有很多很多的数列!” 于是小晴天就把这个数列的所有连续子数列写出来. 然后小晴天把每个连续子数列中的最大的数写出来. 那么,有多少个比K大呢? Input 多组数据,首先是一

【算法学习笔记】35.高精度 竖式乘法 SJTU OJ 1274

Description 输入a,b 输出a*b的竖式乘法,格式见样例. Sample Input1 11 9 Sample Output1 11 9 -- 99 Sample Input2 10 10 Sample Output2 10 10 --- 100 Sample Input3 101 101 Sample Output3 101 101 ----- 101 101 ----- 10201 Sample Input4 10086 2 Sample Output4 2 10086 ----