关于回溯模型的两种解空间树

来源:互联网 发布:pic单片机指令周期 编辑:程序博客网 时间:2024/06/06 04:34
#include <iostream>#include <sstream>#include <stdio.h>#include <algorithm>#include <string.h>#include <stack>#include <queue>#include <set>#include <math.h>/*=======================================回溯法的解空间树以排列为例1 2 3 4输出一共16种,采用两种解空间树========================================*/#define flush(arr, i) memset(arr, i, sizeof(arr))typedef long long int64;using namespace std;const int MAX_ITEM = 128;//const int oo = 0x7fffffff;const int oo = 0x3f3f3f3f;bool vis[MAX_ITEM];int item[] = {2, 4, 5, 9}, dp = 4, arr[MAX_ITEM];//关注当前这个元素选不选//入口参数表示深度void traverse_whether(int d){    if(d > dp)    {        for(int i = 1; i < d; i++)            if(vis[i]) printf("%d ", item[i - 1]);        printf("\n");        return;    }    vis[d] = 1, traverse_whether(d + 1);    vis[d] = 0, traverse_whether(d + 1);}//关注于当前元素选什么//cnt表示当前要放的元素下标,d表示当前要选的元素下标void traverse_what(int d, int cnt){    if(d == dp + 1)    {        //删除最后一个,表示什么都不选        for(int i = 0; i < cnt - 1; i++)            printf("%d ", arr[i]);        printf("\n");        return;    }    for(int i = d; i <= dp; i++)    {        //选当前的        arr[cnt] = item[i];        cnt++;        traverse_what(i + 1, cnt);        cnt--;    }}int main(){    flush(vis, 0);    printf("着重于当前是否选\n");    traverse_whether(1);    printf("==============================\n着重于当前选什么\n");    traverse_what(0, 0);    printf("==============================\n");    return 0;}

0 0
原创粉丝点击