您的位置:首页 > 其它

网上看到的上交的研究生考题

2013-03-14 23:03 253 查看
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  一共有多少种情况?

今天偶然间看到这道题,看到很多人跟帖,也有很多作法,贡献dp解法一种。

//1 2 3
//4 5 6
//7 8 9
//   0
int Map[10][10];
int dp[10][10];
int main()
{
memset(Map,0,sizeof(Map));
memset(dp,0,sizeof(dp));
Map[0][8] = 1;
Map[1][2] = Map[1][4] = 1;
Map[2][1] = Map[2][5] = Map[2][3] = 1;
Map[3][2] = Map[3][6] = 1;
Map[4][1] = Map[4][5] = Map[4][7] = 1;
Map[5][2] = Map[5][4] = Map[5][6] = Map[5][8] = 1;
Map[6][3] = Map[6][5] = Map[6][9] = 1;
Map[7][8] = Map[7][4] = 1;
Map[8][5] = Map[8][7] = Map[8][0] = Map[8][9] = 1;
Map[9][6] = Map[9][8] = 1;
for (int i = 0 ; i < 10 ; i ++)
dp[i][1] = 1;
for (int j = 2 ;j <= 8 ;j ++)
for (int i = 0 ;i <10 ;i ++)
{
for (int k = 0 ; k < 10 ; k ++)
{
if(Map[i][k])
dp[i][j] += dp[k][j-1];
}
}
int ans = 0;
for (int i = 0 ; i < 10 ; i ++)
ans += dp[i][8];
cout << ans<<endl;
}

还有一种dfs的方法

//1 2 3
//4 5 6
//7 8 9
// 0

int ans = 0;
int Map[10][5]=
{
{8,-1},
{2,4,-1},
{1,3,5,-1},
{2,6,-1},
{1,5,7,-1},
{2,4,6,8,-1},
{3,5,9,-1},
{4,8,-1},
{0,5,7,9,-1},
{6,8,-1}
};
void dfs(int now,int num)
{
if(num == 7)
{
ans ++;
return ;
}
for (int i = 0 ; i < 5; i ++)
{
if(Map[now][i] != -1)
{
int k = num + 1;
dfs(Map[now][i],k);
}
else
break;
}
}
int main()
{
for (int i = 0 ; i < 10 ; i ++)
dfs(i,0);
cout <<ans <<endl;
}


继续研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: