牛客编程巅峰赛S1第2场 - 黄金&钻石 1.规律 2.bfs

链接:https://ac.nowcoder.com/acm/contest/6357/A
来源:牛客网

题目描述
牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f(1)=a, f(2)=b, 现在给定初始值 a, b,现在求第n项f(n)%1000000007的值。
其中 1<=|x|, |y|, n<=10^9

示例1
输入
复制
1,2,3
输出
复制
1
说明
f(2)=f(3)+f(1), 所以f(3) = f(2)-f(1)=2-1=1
示例2
输入
复制
-1,-2,3
输出
复制
1000000006
说明
同样例1:f(3)=-1%1000000007=1000000006

class Solution {
public:
    /**
     * 
     * @param a int整型 
     * @param b int整型 
     * @param n int整型 
     * @return int整型
     */
    const int mod=1000000007;
    typedef long long ll;
    int solve(int a, int b, int n) {
       ll c=(b-a)%mod;
        ll f[]={a,b,c,-a,-b,-c};
       return (f[(n-1)%6]+mod)%mod;
    }
};

链接:https://ac.nowcoder.com/acm/contest/6357/B
来源:牛客网

题目描述
题面:
牛牛收到了一个任务,任务要求牛牛破译一个密码。牛牛将被给予两个字符串s1和s2,均由四个小写字母构成。需要破译的密码为从s1变换到s2最少需要的变换次数。
变换的方式是这样:每次变换可以选择当前字符串中的一个位置,然后剩下的三个位置的字符从左到右分别加上2,3,5,若是超出’z’,则重新从’a’开始,例如:对于字符串"abcd",我们选择’c’的位置进行变换,则变换之后的字符串为"ceci";对于字符串"qyzr",我们选择’r’位置进行变换,则变换之后的字符串为"sber"。

示例1
输入
复制
“aaaa”,“ccgk”
输出
复制
2
说明
第一次变换选择第一个’a’,变成"acdf",第二次变换选择第二个’c’,变成"ccgk",故答案为2

class Solution {
public:
    /**
     * 返回最终的答案
     * @param s1 string字符串 表示初始的字符串
     * @param s2 string字符串 表示目标的字符串
     * @return int整型
     */
  int vis[27][27][27][27];
    struct node{
        int x,y,z,d,s;
      
    };
    int bfs(string s1,string s2){
       queue<node>q;
        int a=s1[0]-'a';
        int b=s1[1]-'a';
         int c=s1[2]-'a';
        int d=s1[3]-'a';
          int aa=s2[0]-'a';
        int bb=s2[1]-'a';
         int cc=s2[2]-'a';
        int dd=s2[3]-'a';
       q.push((node){a,b,c,d,0});
       vis[a][b][c][d]=1;
       while(!q.empty()){
       	node no=q.front();
       	q.pop();
       	if(no.x==aa&&no.y==bb&&no.z==cc&&no.d==dd){
       		return no.s;
		}
		node ans=(node){no.x,(no.y+2)%26,(no.z+3)%26,(no.d+5)%26,no.s+1};
		if(!vis[ans.x][ans.y][ans.z][ans.d]){
			q.push(ans);
			vis[ans.x][ans.y][ans.z][ans.d]=1;
		}
			ans=(node){(no.x+2)%26,no.y,(no.z+3)%26,(no.d+5)%26,no.s+1};
		if(!vis[ans.x][ans.y][ans.z][ans.d]){
			q.push(ans);
			vis[ans.x][ans.y][ans.z][ans.d]=1;
		}
			 ans=(node){(no.x+2)%26,(no.y+3)%26,no.z,(no.d+5)%26,no.s+1};
		if(!vis[ans.x][ans.y][ans.z][ans.d]){
			q.push(ans);
			vis[ans.x][ans.y][ans.z][ans.d]=1;
		}
			 ans=(node){(no.x+2)%26,(no.y+3)%26,(no.z+5)%26,no.d,no.s+1};
		if(!vis[ans.x][ans.y][ans.z][ans.d]){
			q.push(ans);
			vis[ans.x][ans.y][ans.z][ans.d]=1;
		}
	   }
	   return 0;
     }
    int solve(string s1, string s2) {
        memset(vis,0,sizeof(vis));
        return bfs(s1,s2);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值