2019.11.26
一背景:
老板心血来潮找来C试题试试我们的深浅,Google 原题源于某论坛但暂时未解答,排列组合算法实现是关键,通过大佬指导,利用C语言排列组合实现。
二 题目要求
题目解释:程序要求输入行数1-100和列数1-10 的数组(数组元素为0或1),每次只翻动一行或者一列,即不允许翻动单个元素,使得最终数组中的1最多。
example:
三. C语言实现思路
开发环境visual studio 2017:
1.单行单列翻转容易处理,0多余1翻转,反之不翻转。
2.多行多列比较麻烦,开始认为只翻转0多余1的行和列就可以,但是发现0和1相等或者1多余0的行列的翻转会互相影响,有的组合翻转可以使得1的个数增加,所以不能简单考虑,必须组合翻转判断是否可取。
四. Source code
1.C语言排列组合测试code,可以用两个for循环实现。
//Source code
#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[3] = {
0,1,2 };
int count = 3;
int i, j;
for (i = 1; i < (1 << count); i++)
{
printf("jeet test loop =%d\n", i);
for (j = 0; j < count; j++)
{
if (i & (1 << j))
{
printf("jeet test array[j]=%d\n", array[j]);
}
}
}
return 0;
}
#endif
测试log
jeet test loop =1
jeet test array[j]=0
jeet test loop =2
jeet test array[j]=1
jeet test loop =3
jeet test array[j]=0
jeet test array[j]=1
jeet test loop =4
jeet test array[j]=2
jeet test loop =5
jeet test array[j]=0
jeet test array[j]=2
jeet test loop =6
jeet test array[j]=1
jeet test array[j]=2
jeet test loop =7
jeet test array[j]=0
jeet test array[j]=1
jeet test array[j]=2
G:\little_fish\fish_c_lesson\jeet_c_practise\2019_1119\coinFliping\coinFliping\Debug\coinFliping.exe (进程 7696)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...
2. 题目实现source code
//source code
//coin flipping easy game
//Author: Jeet.Liu
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <math.h>
#define DEBUG_LOG 0
int rows, columns;
int* rowequalArray;
int* columnequalArray;
int* coinArray;
int* backcoinArray;
int* tempcoinArray;
void dataCheck(void);
void rowTrans(int rowtransNum);
void columnTrans(int columntransNum);
int rowSum(int rowsumNum);
int columnSum(int columnsumNum);
int rowabsSum(void);
int columnabsSum(void);
int rowandcoluSum(void);
int inputInteger(const char* prompt, int max, int min);
void inputArray(int* tempArr, int tempRow, int tempColumn);
void outputArray(int* tempArr, int tempRow, int tempColumn);
void arrayConvert(int* tempArr, int tempRow, int tempColumn);
void arrayRestore(int* tempArr, int tempRow, int tempColumn);
void onelineTrans(int* tempArr, int tempRow, int tempColumn);
int main()
{
int i, j;
rows = inputInteger("行数 请输入1~100之间的整数:", 100, 1);
printf("用户输入的行数是:%d\n", rows);
columns = inputInteger("列数 请输入1~10之间的整数:", 10, 1);
printf("用户输入的列数是:%d\n", columns)