/*
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;
}