洛谷 P1037 产生数 题解

该博客详细介绍了洛谷P1037问题的两种解决方案,分别是图论和BFS。在图论方法中,涉及到了高精度计算,博主分享了完整的AC代码。而在BFS方法中,使用了向量数组和集合进行BFS搜索,虽然未得到AC,但也给出了代码实现。
摘要由CSDN通过智能技术生成

此题有两种解法:图论或者BFS

产生数的题址,相信是个人都能读懂。
两种方法都讲一下
本人太菜,BFS超时,所以先讲图论

解法一:图论

直接上代码:

for(int i=0;i<n;i++) //for 1 to n 也行
    {
   
       cin>>x>>y;//读进来规则 假设读进来2 5
       GA[x][y]=1;//2行5列打个勾,表示2能变5。(把GA做成bool也行)
    }
for(int k=1;k<=9;k++)//k是中间人
      for(int i=0;i<=9;i++)//i是规则左部,可以为0
        for(int j=1;j<=9;j++)//j是规则右部,不可以是0
           if(GA[i][k] && GA[k][j])//如果i可以变成k,k可以变成j 
              GA[i][j]=1;//那么i也可以变成j

 //这就是图论中的Floyd算法     ```cpp
for(int i=0;i<10;i++)//进一步改造
    {
   
       GA[i][i]=1;//i能变成i
       for(int j=0;j<10;j++)
          if(GA[i][j])  d[i]++;//在计算每一个i可以变成多少个花样,存在d[i]中

这道题还涉及到一个高精度计算。
为什么呢?来让我给你比划一下:
对于每一个数 i 有九种变法(包括他自己),但题目说 n<10^30,最多有 30位呢!9^30会很大的!!肯定超过 long long

高精度乘法框架:

int c=0;//c是进位
    p[0]=1;//p数组存的是高精度结果
    for(int i=0;a[i];i++)//表达式2为真,即a[i]为真
   {
     
       c=0;
       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值