C语言实现排列组合的经典应用(例如:0,1,2元素共有0;1;2;01;02;12;012 (2^3-1中组合) )

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值