1. 程式人生 > >備戰Noip2018模擬賽10(B組) T4 Alpha2 蟲食算

備戰Noip2018模擬賽10(B組) T4 Alpha2 蟲食算

10月20日備戰Noip2018模擬賽10

T4 Alpha2蟲食算

題目描述

粗心的小明把墨水潑在了乘法算式上,由於他實在是太弱了,不知道怎麼辦,所以請了巨佬PYZ,PYZ看了一眼就說,我不僅可以求出來,我還可以求出很多個解。

下面是一個乘法算式,但是所有的數字都看不見了。

      * * *

   X * *

    -----------

      * * *

    * * *

    -----------

    * * * *

    如果一個“*”可以是任何一個數字,想必這個蟲食算有相當多的解;但如果一個“*”只能從給定集合中選取數字,那麼這個蟲食算有多少個解呢?

輸入格式

 第一行有一個正整數N,代表可選數字的個數。

    第二行有Ñ個用空格隔開的數字,這些數字只能是1到9中的一個,並且它們互不相同。這些數字表示一個*可以代表的數字。

輸出格式

一行一個整數,總的方案數。

輸入樣例

5
2 3 4 6 8

輸出樣例

1

樣例解釋

下面顯示了該蟲食算滿足樣例輸入條件的唯一解。

      2 2 2

    x 2 2

     ------

      4 4 4

    4 4 4

  ---------

4 8 8 4

資料範圍

50%資料:n <= 5; 100%資料:n <= 9

思路

暴力!

一個個列舉所有可能的數,再判斷是否合法。

程式碼

#include <iostream>
#include <cstdio>
 
using namespace std;
 
int n, x, x1, x2, x3, x4, cnt;
bool b[10];
 
bool isAvailable (int x)            //這個函式用來判斷所選數的每一個數字是否在輸入的陣列中
{
	x1 = x % 10 / 1;
	x2 = x % 100 / 10;
	x3 = x % 1000 / 100;
	x4 = x % 10000 / 1000;
	if (x < 100){
		if (!b[x1] || !b[x2]) return false;
	}
	else if (x >= 100 && x < 1000){
		if (!b[x1] || !b[x2] || !b[x3]) return false;
	}
	else{
		if (!b[x1] || !b[x2] || !b[x3] || !b[x4]) return false;
	}
	return true;
}
 
int main ()
{
	//freopen ("alpha2.in", "r", stdin);
	//freopen ("alpha2.out", "w", stdout);
	
	cin >> n;
	for (int i = 1; i <= n; i ++){
		cin >> x;
		b[x] = 1;
	}
	
	cnt = 0;
	for (int i = 100; i < 1000; i ++){
		if (! isAvailable (i)) continue;            //這個數的每一位都合法
		for (int j = 10; j < 100; j ++){
			if (! isAvailable (j)) continue;            //這個數的每一位都合法
			if (i * j >= 10000) continue;            //這個數是四位數
			if (i * (j % 10) >= 1000) continue;            //三位數
			if (i * (j / 10) >= 1000) continue;            //三位數
			if (! isAvailable (i * (j % 10))) continue;
			if (! isAvailable (i * (j / 10))) continue;
			if (! isAvailable (i * j)) continue;
			cnt ++;
		}
	}
	
	cout << cnt;
	
	//fclose (stdin);
	//fclose (stdout); 
	return 0;
}