[优快云]首页看到的一道算法题

本文探讨了一种特殊手机号生成算法,该算法基于象棋中的“将步”概念来限制数字间的连接方式。文章提供了一段C语言实现的示例代码,并通过回溯算法的思想展示了如何在给定前缀的情况下生成符合特定规则的手机号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1  2  3   
4  5  6
7  8  9 
    0  
说某移动电信运营商开发了一个名为“争霸”的游戏,为鼓励用户参与,凡签约用户均可获得前三位为888的手机号码,但这样的话就有10的8次方种可能,现在给出一种限制条件减少号码数量,就是两个相邻号码之间的关系必须满足象棋里的“将步”
即:给你前三位都是888  后面8位是上面的数字  每个数的相邻只有有限个数字
比如8881*  那么与1相邻的只可以是2和4  
888812那么与2相邻的只可以是1,5,3  就是这个意思
如果选择5  那么可以选择的有2,4,6,8 
问:
1  用什么算法比较好?为什么?
2  最优的算法是什么?为什么?
3  用什么数据结构最好?为什么?
4  时间复杂度和空间复杂度?

5  一共有多少种情况?


#include "stdio.h"
#include "stdlib.h"

int main(int argc, char* argv[])
{
	int a[10]={1,1,1,1,1,1,1,1,1,1};
	int b[10];

	for(int i=1;i<=7;i++){

	for(int j=0;j<=9;j++){
        	b[j]=a[j];	
	}

	a[0]=b[8];
	a[1]=b[2]+b[4];
	a[2]=b[1]+b[3]+b[5];
	a[3]=b[2]+b[6];
        a[4]=b[1]+b[5]+b[7];
	a[5]=b[2]+b[4]+b[6]+b[8];
	a[6]=b[3]+b[9]+b[5];
	a[7]=b[4]+b[8];
	a[8]=b[5]+b[7]+b[9]+b[0];
	a[9]=b[6]+b[8];
	}

	int sum=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9];
	printf("sum=%d\n",sum);
	return 0;
}

sum=14826

应该是属于回溯算法的性质吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值