【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数

  给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15)。

  规则:1、1个数字可以变换成另1个数字;

     2、规则中右边的数字不能为零。

  

  BFS

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 1000
 4 
 5 char num[33];
 6 int len,q[maxn],Visited[11];
 7 long long ans = 1;
 8 
 9 int main (){
10 //    freopen ("produce.in","r",stdin);
11 //    freopen ("produce.out","w",stdout); 
12     
13     int i,j,k;
14     int K,x[16],y[16];
15     
16     scanf ("%s%d",num,&K);
17     for (i = 1;i<=K;i++)
18         scanf ("%d%d",x+i,y+i);
19     len = strlen (num);    
20         
21     int head = 0,tail = 0,temp;
22         
23     for (j = 0;j<len;j++){
24         temp = 1;
25         memset (Visited,0,sizeof(Visited));
26         q[++tail] = num[j]-'0';
27         do{
28             head++;
29             for (i = 1;i<=K;i++){
30                 if (q[head] == x[i] && Visited[y[i]] == 0){
31                     q[++tail] = y[i];
32                     temp++;            
33                     Visited[x[i]] = 1;
34                     Visited[y[i]] = 1;
35                 }
36                 
37             }
38         }while (head<tail);
39         ans*=temp;
40     }
41     
42     printf ("%lld",ans);
43     
44     return 0;
45 }

 

转载于:https://www.cnblogs.com/Aeolus/p/5195931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值