上交硕士上机题

本文探讨了一种特殊的手机号生成问题,该问题基于象棋中的“将步”概念来限制数字间的连接方式。文章提供了一种递归算法实现,并通过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 <iostream>
#include <algorithm>

int map[10][5]=
{
	{8,-1},//0
	{2,4,-1},//1
	{1,3,5,-1},//2
	{2,6,-1},//3
	{1,5,7,-1},//4
	{2,4,6,8,-1},//5
	{3,5,9,-1}, //6
	{4,8,-1}, //7
	{0,5,7,9,-1}, //8
	{6,8,-1} //9
};

unsigned long long sum(int pre_num,int n)
{
	unsigned long long tem=0;
	int* p=map[pre_num];
	while(*p!=-1)
	{
		if(n==1)
		{
			++tem;
		}
		else
		{
			tem+=sum(*p,n-1);
		}
		++p;
	}
	return tem;
}

unsigned long long count(int n)
{
	unsigned long long tem=0;
	for(int i=0;i<10;++i)
	{
		tem+=sum(i,n-1);
	}
	return tem;
}

int main(int argc,char* argv[])
{
	std::cout<<count(8)<<std::endl;
	system("PAUSE");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值