(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);
}
}
#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);
}
#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);
}
上面的解法是对状态空间进行先根遍历的过程。
类似的问题有:骑士,迷宫等等。