您的位置:首页 > 职场人生

师兄面试总结编程部分解答之五

2014-08-27 20:55 239 查看
五、递归

青蛙跳楼梯(每次跳1或2层,跳到N层有多少种跳法)

//青蛙跳楼梯(每次跳1或2层,跳到N层有多少种跳法)类似斐波那契数列
int frogJump(int level)
{
int* select = new int[level];//表示到达第i层共有多少种跳法
select[0] = 1;
select[1] = 2;
for(int i = 2; i < level; i++)
{
select[i] = select[i - 1] + select[i - 2];
}
printf("%d\n",select[level-1]);
return select[level - 1];
}


3、N×N的棋盘,从一角走到另一角,只能走“日”字,即象棋中的马,问有多少种走法等

//N×N的棋盘,从一角走到另一角,只能走“日”字,即象棋中的马,问有多少种走法等
//形参N表示棋盘尺寸
int chessboard(int N)
{
//所谓走“日”字,即为只能横向或纵向走一个单元格
//grid(i, j) = grid(i - 1, j) + grid(i, j - 1)//动态规划
int* grid = new int[N*N];
//首先对左侧及上侧单元格进行初始化,初始化为1
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if(i == 0 || j == 0)
grid[i * N + j] = 1;
else
{
grid[i * N + j] = grid[(i - 1) * N + j] + grid[i * N + j - 1];
}
}
}
return grid[ N*N - 1 ];
}

六、全排列

1、字符输出有多少种全排列(需递归调用二次)

//字符输出有多少种全排列,即输出字符所有组合可能,递归及非递归实现
//str为给定字符串
//递归形式
void swap(char* src,char* dest)
{
char tmp = *src;
*src = *dest;
*dest = tmp;
}
void permutation_recu(char* str,char* begin)
{
//遍历固定一个字符,将之后的片段继续遍历固定第一个字符,与剩余部分进行交换,
if(*begin == '\0')
printf("%s\n",str);
//将所以字符依次放在第一个位置
char* cur = begin;
while(*cur != '\0')
{
swap(cur,begin);
permutation_recu(str,begin + 1);
swap(cur,begin);
cur++;
}
}

2、八皇后问题

/八皇后问题,得到最终可能的排列组合数
static int queue_count = 0;

bool judgeQueue(int queue[])
{
for(int i = 1; i < 8; i++)
{
int row = i;
int col = queue[i];

for(int j = 0; j < i; j++)
{
int rowOld = j;
int colOld = queue[j];

if (colOld == col)
return false;
if (colOld - rowOld == col - row)
return false;
if(colOld + rowOld == row + col)
return false;
}
}
return true;
}
void eightQueue(int queue[],int begin)
{

//每行中均含有一个皇后,之后的问题便是,如何在列方向进行八皇后的移动,
//每个皇后同样共有八种移动可能,类似全排列思路,最复杂的解决方案,
if(begin == 8)
{
if(judgeQueue(queue))
queue_count++;
return;
}
for(int i = 0; i < 8; i++)
{
queue[begin] = i;
eightQueue(queue,begin + 1);
}
}
//解题太慢了,,,批评
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: