C language-Blue Bridge Cup algorithm improves VIP-generated number

Question description

Given an integer n and k transformation rules.
Rule:
A one-digit number can be transformed into another one-digit number:
the right side of the rule cannot be zero.
For example: n=234. There are rules (k=2):
2-> 5
3-> 6.
The above integer 234 may be generated after transformation (including the original number):
234
534
264
564.
A total of 4 different generated numbers
. Question:
Given An integer n and k rules.
Find:
how many different integers can be produced after any number of transformations (0 or more times).
Only the number of outputs is required.

Input format

n k 
x1 y1 
x2 y2 
... ... 

xn is 

(n< 10^30) 

(k< =15)

Output format

An integer (the number that satisfies the condition)

Sample input

234 2
2 5
3 6

Sample output

4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
int cnt, len;
int head[10];
bool visited[10];
int transform[10];                            //存储1-9每个数能变的可能数
int a[250];
void HighAccuracyMutiplication(int a[], int n)    //高精度乘法
{
    len = a[0];
    char tmp[100];
    sprintf(tmp, "%d", n);
    for (int i = 1; i <= len; i++) 
        a[i] *= n;
    for (int i = 1; i <= len; i++) {
        a[i + 1] += a[i] / 10;
        a[i] %= 10;
    }
    len = a[0] + strlen(tmp);        //因为两数之积的位数不超过两数位数之和
    while (a[len] == 0 && len > 1) len--;
    a[0] = len;
}
struct Edge {                        //链式前向星储存数的变换法则,用邻接矩阵/邻接表也行
    int next, to;
};
struct Edge edge[15];
typedef struct QNode {                //萌新没学过c++QAQ,每次做图的题都要自己实现队列
    int Data[20];
    int front, rear;
}*Queue;
void Enqueue(int item, Queue Q)        //入队
{
    Q->rear = (Q->rear + 1) % 20;
    Q->Data[Q->rear] = item;
}
int Dequeue(Queue Q)                //出队
{
    Q->front = (Q->front + 1) % 20;
    return Q->Data[Q->front];
}
void add(int u, int v)                //链式前向星的加边操作
{
    edge[cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}
int BFS(int element, Queue Q)        //查找指定数字所有可能变换结果,也就是图里与该数连通的数字
{
    memset(visited, 0, sizeof(visited));
    visited[element] = true;
    Enqueue(element, Q);
    int V, sum = 1;
    while (Q->front != Q->rear) {
        V = Dequeue(Q);
        for (int i = head[V]; i != -1; i = edge[i].next) {
            if (!visited[edge[i].to]) {
                sum++;
                Enqueue(edge[i].to, Q);
                visited[edge[i].to] = true;
            }
        }
    }
    return sum;
}
int main()
{
    Queue Q = (Queue)malloc(sizeof(struct QNode));
    Q->front = Q->rear = 0;
    memset(head, -1, sizeof(head));
    int k, u, v;
    char s[32];
    scanf("%s", s);
    scanf("%d", &k);
    while (k--) {
        scanf("%d%d", &u, &v);
        add(u, v);
    }
    for (int i = 0; i <= 9; i++)
        transform[i] = BFS(i, Q);
    a[0] = a[1] = 1;
    for (int i = 0; i < strlen(s); i++)
        HighAccuracyMutiplication(a, transform[s[i] - '0']);
    for (int i = len; i >= 1; i--) printf("%d", a[i]);
    return 0;
}

Guess you like

Origin blog.csdn.net/Joy19981127/article/details/135462492