简单搜索

来源:互联网 发布:凯恩之角数据库 编辑:程序博客网 时间:2024/06/01 18:05

1.学习算法发现自己了解不深,读啊哈算法了解基础的搜索

1.1 解决全排列问题

1234 ,就是将这个四个数排列出不同顺序的组合,一共是24可能, 1234 ,1243 1324 1342  1423 1432,这是1在前面的情况,如果使用c语言就要用 枚举法全部把情况列出来;
for ( int a = 1; a <= 4; a++){for (int b = 1; b <= 4; b++){for (int c = 1; c <= 4; c++){for (int d = 1; d <= 4; d++){if (a != b && a != c && a != d && b != c && b != d && c != d){printf("%d%d%d%d\n", a, b, c, d);}}}}}
1.2 理解简单的深度优先(不是很懂)
问题: 有 1,2,3 个箱子 我们 按顺序在箱子中 存数 1,2,3    第一个箱子放入1,第二个箱子放入2,第三个箱子放入3,手上没有数然后 从第三个箱子取数,第二个箱子取2,
然后 放入 1 3 2,这样执行操作;
int a[10], book[10], n;// a是箱子,book是手上的数,n 表示1,2,3 总共的数 全局变量不用别赋初值void store(int step){int i;if (step == n + 1){//输出所有的排列for (i = 1; i <= n; i++){printf("%d", a[i]);}printf("\n");return;//输出完返回才会结束}for (i = 1; i <= n; i++){//关键 判断if (book[i] == 0)//book[i]=1 表示手上没 i这张牌,0表示有{a[step] = i;book[i] = 1;//放牌store(step + 1);//关键操作book[i] = 0;//取牌}}}
1.3 应用解题  xxx+xxx=xxx  ; 如果暴力求解很耗时间,使用上面的方法就可以解决;
int a[10], book[10], n;// a是箱子,book是手上的数,n 表示1,2,3 总共的数 全局变量不用别赋初值void store(int step){int i;if (step == 10){if (100 * a[1] + 10 * a[2] + a[3] + 100 * a[4] + 10 * a[5] + a[6] == (100 * a[7] + 10 * a[8] + a[9])){//输出所有的排列for (i = 1; i <= 9; i++){printf("%d", a[i]);}n++;printf("\n");return;//输出完返回才会结束}}for (i = 1; i <= 9; i++){//关键 判断if (book[i] == 0)//book[i]=1 表示手上没 i这张牌,0表示有{a[step] = i;book[i] = 1;//放牌store(step + 1);//关键操作book[i] = 0;//取牌}}}int main(){store(1);printf("解的个数是%d", n / 2);getchar();return 0;}
比如659 124 783和 124 659 783是重复的,所以要n/2,答案是168个解;


原创粉丝点击