//
// ViewController.m
// 算法测试
//
// Created by apple on 16/3/30.
// Copyright © 2016年 李重阳. All rights reserved.
//
#import "ViewController.h"
int firstCount = 0;
int inputNum[3] = {0};
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.
[self test1];
}
/**
【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
*/
- (void)test1 {
int num[4] = {1,2,3,4};
getThreeNum(0, num);
}
// index 从0开始
void getThreeNum(int index,int *num){
if (index == 3) {
printf("第%d个:", ++firstCount);
for (int i = 0; i<3; i++) {
printf("%d",inputNum[i]);
}
printf("\n");
}else {
for (int i = 1; i<=4; i++) {
//index 以后的数据要清空
for (int k = index; k<3; k++) {
inputNum[k] = 0;
}
//判断下个书籍是否可以加入,index 以前的来判断
BOOL isCanJoinNum = YES;
//当前的将要放入的值 在tempNum 是存在的
for (int k = 0; k<index; k++) {
if (i == inputNum[k]) {
isCanJoinNum = NO;
break;
}
}
if (isCanJoinNum) {
inputNum[index] = i;
getThreeNum(index+1, num);
}else {
continue;
}
}
}
}
@end
更加简单的办法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
int map[5] = {0};
int save[4] = {0};
test1(0,map,save);
}
/**
【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
可以理解成 3个桶 A,B,C
在A 桶的时候 可以顺序的放入 1,2,3,4
在B 桶中 只能 放入 不在A桶的数 (需要用 一个 Map 数组来标记是否访问过的)
在C 桶中也是一样的
*/
void test1(int step,int * map,int * save) {
if (step == 3) {
for (int i = 0 ; i < 3; i ++) {
printf("%d",save[i]);
}
printf("\n");
return;
}
for (int i = 1 ; i <= 4; i ++) { //1,2,3,4
if (map[i] == 0) {
map[i] = 1;//标记当前的i 已经被用了 不能再用了
save[step] = i;
test1(step+1,map,save);
//把当前的 i 解除占用,这样在第二步的时候 还是可以用这个i
map[i] = 0;
}
}
}