vijos P1129 产生数

来源:互联网 发布:韩国女团身材管理知乎 编辑:程序博客网 时间:2024/05/21 12:45

题意:输入n组数a->b,再输入一串数字,其中数字可由a变换为b,求存在多少种情况。

链接:https://vijos.org/p/1129

思路:可转化为一个最短路径问题。将10个数字的变换情况分别看作一个节点,利用floyd求出所有通路,统计每种数的变换可能,再转化为组合问题。

注意点:求组合时要考虑溢出的可能。用大数乘法。

以下为AC代码:

评测状态Accepted题目P1129 产生数递交时间2014-11-06 17:14:05代码语言C++评测机VijosEx消耗时间15 ms消耗内存280 KiB评测时间2014-11-06 17:14:07

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>using namespace std;struct node{    char a;    char b;    friend bool operator < ( const node &a, const node &b )    {        return a.b < b.b;    }} p[20];bool adj[10][10];int ans[50];void muti ( int m ){    int tmp = 0;    for ( int i = 0; i < 50; i ++ )    {        tmp = ans[i] * m + tmp;        ans[i] = tmp % 10000;        tmp = tmp / 10000;    }}void floyd ( int n ){    for ( int i = 0; i < n; i ++ )    {        adj[i][i] = true;        for ( int j = 0; j < n; j ++ )        {            for ( int k = 0; k < n; k ++ )            {                if ( adj[j][i] && adj[i][k] )                {                    adj[j][k] = true;                }            }        }    }}int main(){    int num[15] = { 0 };    string str;    while ( cin >> str )    {        int n;        cin >> n;        memset ( adj, 0, sizeof ( adj ) );        memset ( ans, 0, sizeof ( ans ) );        for ( int i = 0; i < n; i ++ )        {            cin.clear();            cin >> p[i].a;            cin.clear();            cin >> p[i].b;            adj[p[i].a-'0'][p[i].b-'0'] = true;        }        floyd( 10 );        for ( int i = 0; i < 10; i ++ )        {            num[i] = 0;            for ( int j = 0; j < 10; j ++ )            {                if ( adj[i][j] )                {                    num[i] ++;                }            }        }        ans[0] = 1;        for ( int i = 0; i < (int)str.size(); i ++ )        {            muti ( num[str[i] - '0'] );        }        int k;        for ( k = 49; k >= 0 && ans[k] == 0; k -- );        printf ( "%d", ans[k] );        k --;        for ( ; k >= 0; k -- )        {            printf ( "%04d", ans[k] );        }        cout << endl;    }    return 0;}


0 0
原创粉丝点击