数据结构 树 回溯法与树的遍历

(1)求幂集

#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

char A[] = ... {'A','B','C','D'} ;

void power( char flag[], int i, int n) ... {
if(i>n)...{
for(inti=0;i<n;i++)...{
if(flag[i]=='1')...{
printf(
"%c",A[i]);
}

}

printf(
" ");
}
else...{
char*copy=(char*)malloc(sizeof(char)*n);
memcpy(copy,flag,n);

//theielementexists
flag[i-1]='1';
power(flag,i
+1,n);

//theielementdoesnotexist
copy[i-1]='0';
power(copy,i
+1,n);
}

}

(2)n皇后问题

#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >

/**/ /**
*是否在同一列?
*0:是
*1:否
*/

int checkCol( char flag[], int i, char j) ... {
for(intk=0;k<i;k++)...{
if(flag[k]==j)...{
return0;
}

}

return1;
}


/**/ /**
*是否在同一对角线?
*0:是
*1:否
*/

int checkDiag( char flag[], int i, char j) ... {
if(i==0)
return1;

if(flag[i-1]==j-1||flag[i-1]==j+1)...{
return0;
}
else...{
return1;
}

}


void trial( char flag[], int i, int n) ... {
if(i>=n)...{
//printcurrentsolution
for(inti=0;i<n;i++)...{
printf(
"%c",flag[i]);
}

printf(
" ");
}
else...{
for(charj='0';j<'0'+n;j++)...{
if(checkCol(flag,i,j)&&checkDiag(flag,i,j))...{
char*copy=(char*)malloc(sizeof(int)*n);
memcpy(copy,flag,n);

copy[i]
=j;
trial(copy,i
+1,n);
}

}

}

}


void main() ... {
charflag[6];
intn=6;
//power(flag,1,n);
trial(flag,0,n);
}

上面的解法是对状态空间进行先根遍历的过程。

类似的问题有:骑士,迷宫等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值