• 洛谷 P1037【产生数】


    描述

    给出一个整数n(n<=2000)和k个变换规则(k≤15)。规则:
    ① 1个数字可以变换成另1个数字;
    ② 规则中,右边的数字不能为零。
    例如:n=234,k=2规则为
    2 → 5
    3 → 6
    上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。求经过任意
    次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。

    输入输出格式

    输入

    n
    k
    x1 y1
    x2 y2
    … …
    xn yn

    输出

    格式为一个整数(满足条件的整数个数)。

    输入输出样例

    输入样例1

    234
    2
    2 5
    3 6

    输出样例1

    4
    

    解题思路

      这道题,我用的string存的数字,用map映射是否找到过,用vector记录变化规则,用queue当DFS来查找,最后记得特判最后一位0的情况。

    题解

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 vector<int> v[1001];
     4 map<string,int> sj;
     5 queue <string> q;
     6 int k,ans;
     7 string n;
     8 int main()
     9 {    
    10     cin>>n>>k;
    11     while(k--)//输入规则 
    12     {
    13         int x,y;
    14         cin>>x>>y;
    15         v[x].push_back(y);
    16     }
    17     ans++;//本来自己就是一种方法 
    18     sj[n]=1;//标记 
    19     q.push(n);
    20     while(!q.empty())
    21     {
    22         string s=q.front();//取队头 
    23         q.pop();
    24         for(int i=0;i<s.size();i++)//一位一位看 
    25         {
    26             int num=s[i]-'0';//记录数字 
    27             for(int j=0;j<v[num].size();j++)//看能不能变化 
    28             {
    29                 s[i]=v[num][j]+'0';//变化它 
    30                 if(i==s.size()-1&&s[i]=='0')break;//特判最后一位变成0 
    31                 if(!sj[s])//没找过 
    32                 {
    33                     sj[s]=1;//标记 
    34                     ans++;//方案加一 
    35                     q.push(s);//塞进队列 
    36                 }
    37                 s[i]=num+'0';//还原 
    38             }
    39         }
    40     }
    41     cout<<ans;//输出 
    42     return 0;
    43 }
  • 相关阅读:
    subplots
    异步方法:用async关键字修饰的方法
    async、await原理揭秘
    TCP/IP概述
    EFCore中的IEnumerable和IQueryable的不同之处
    IQueryable底层是如何读取数据的?
    二叉树性质
    几种查找算法
    EFCore中所谓IQueryable
    常用位运算
  • 原文地址:https://www.cnblogs.com/hualian/p/11184369.html
Copyright © 2020-2023  润新知