USACO SEC.1.3 No.4 Prime Cryptarithm

题意:竖式乘法

解法:简单按照题意枚举模拟即可

可以借用一下大数乘法运算方法里面的一些方式

[][][] * [][] = 先乘法得到结果, 再统一处理进位

/*
ID: lsswxr1
PROG: crypt1
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

///宏定义
const int  INF = 1000000000;
const int MAXN = 15;
const int maxn = MAXN;
///全局变量 和 函数

#define USACO
#ifdef USACO
#define cin fin
#define cout fout
#endif
//////////////////////////////////////////////////////////////////////////
int N;
bool num[maxn];
int innum[maxn];
int ans;
int col1[5], col2[5], col3[5];
void testNum(int a, int b, int c, int d, int e)
{
    memset(col1, 0, sizeof(col1));
    memset(col2, 0, sizeof(col2));
    memset(col3, 0, sizeof(col3));
    int mul[3];
    for (int i = 0; i < 3; i++)
    {
        mul[0] = c;
        mul[1] = b;
        mul[2] = a;
    }
    for (int i = 0; i < 3; i++)
    {
        col1[i] += mul[i] * e;
    }
    for (int i = 0; i < 4; i++)
    {
        if (col1[i] > 10)
        {
            col1[i + 1] += col1[i] / 10;
            col1[i] %= 10;
        }
    }
    if (col1[3] != 0)
        return;
    for (int i = 0; i < 3; i++)
    {
        if (!num[col1[i]])
            return;
    }

    //第二行
    for (int i = 1; i < 4; i++)
    {
        col2[i] += mul[i - 1] * d;
    }
    for (int i = 1; i < 4; i++)
    {
        if (col2[i] > 10)
        {
            col2[i + 1] += col2[i] / 10;
            col2[i] %= 10;
        }
    }
    if (col2[4] != 0)
        return;
    for (int i = 1; i < 4; i++)
    {
        if (!num[col2[i]])
            return;
    }

    //结果
    for (int i = 0; i < 4; i++)
    {
        col3[i] = col1[i] + col2[i];
    }
    for (int i = 0; i < 4; i++)
    {
        if (col3[i] > 10)
        {
            col3[i + 1] += col3[i] / 10;
            col3[i] %= 10;
        }
    }
    if (col3[5] != 0)
        return;
    for (int i = 0; i < 4; i++)
    {
        if (!num[col3[i]])
            return;
    }
    ans++;
}

int main()
{

#ifdef USACO    
    ofstream fout ("crypt1.out");
    ifstream fin ("crypt1.in");
#endif    
    ///变量定义
    while (cin >> N)
    {
        memset(num, false, sizeof(num));
        ans = 0;
        for (int i = 0; i < N; i++)
        {
            int tmp;
            cin >> tmp;
            innum[i] = tmp;
            num[tmp] = true;
        }

        for (int d1 = 0; d1 < N; d1++)
        {
            for (int d2 = 0; d2 < N; d2++)
            {
                for (int d3 = 0; d3 < N; d3++)
                {
                    for (int d4 = 0; d4 < N; d4++)
                    {
                        for (int d5 = 0; d5 < N; d5++)
                        {
                            testNum(innum[d1], innum[d2], innum[d3], innum[d4], innum[d5]);
                        }
                    }
                }
            }
        }
        cout << ans << endl;
    }
    ///结束
    return 0;
}

 

posted on 2013-11-28 10:46  小书包_Ray  阅读(217)  评论(0编辑  收藏  举报

导航