一、问题描述
二、问题分析
首先,我在做题时感觉题目描述有些问题,应该是求两组人中男女都不相等的顺序。(我看题以为是两组有一组不均等就行,那可太简单了,汗!)
最近用递归有点上头,于是本能地尝试使用递归进行代码实现,最后报错了,原因是栈溢出了,于是乎,将递归转换为普通的循环(有点动态规划的意思)。而本题的根本逻辑是路径组合问题(如图,需要到达坐标【20,10】),只不过有一些组合是不被允许的(即不允许穿过橙色线)。
三、代码实现
1.C/C++实现
#include <iostream>
#define MAX_MEN 20
#define MAX_WOMEN 10
#define MATRIX_X 25
#define MATRIX_Y 15
using namespace std;
// 迭代矩阵
int matrix[MATRIX_X][MATRIX_Y];
void init(int x, int y)
{
memset(matrix, 0, sizeof(matrix));
if (x >= y)
{
for (int i = 1; i < x - y; i++)
{
matrix[i][0] = 1;
}
}
if (x < y)
{
for (int i = 1; i < y - x; i++)
{
matrix[0][i] = 1;
}
}
return;
}
void update(int x, int y)
{
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
if (i == j || (x - i == y - j))
{
continue;
}
matrix[i][j] += matrix[i - 1][j];
matrix[i][j] += matrix[i][j - 1];
}
}
// 在判断 x - i == y - j 时,略过了matrix[x][y]的计算,需要补上
if (x > 1 && y > 1)
{
matrix[x][y] = matrix[x - 1][y] + matrix[x][y - 1];
}
}
int main()
{
init(MATRIX_X, MATRIX_Y);
update(MAX_MEN, MAX_WOMEN);
cout << matrix[MAX_MEN][MAX_WOMEN] << endl;
return 0;
}
2.Python实现
# coding=utf-8
def get_ways(x, y):
# 构造一个 (x + 1) * (y + 1) 的全 0 矩阵-列表形式
matrix = [[0 for i in range(y + 1)] for j in range(x + 1)]
for i in range(1, abs(x - y)):
if x <= y:
matrix[0][i] = 1
else:
matrix[i][0] = 1
for i in range(1, x + 1):
for j in range(1, y + 1):
if i == j or x - i == y - j:
continue
else:
matrix[i][j] += (matrix[i - 1][j] + matrix[i][j - 1])
matrix[x][y] = matrix[x - 1][y] + matrix[x][y - 1]
return matrix[x][y]
if __name__ == '__main__':
print(get_ways(20, 10))