(1)求幂集
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

voidpower(charflag[],inti,intn)...{
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:否
*/
intcheckCol(charflag[],inti,charj)...{
for(intk=0;k<i;k++)...{
if(flag[k]==j)...{
return0;
}
}
return1;
}

/**//**
*是否在同一对角线?
*0:是
*1:否
*/
intcheckDiag(charflag[],inti,charj)...{
if(i==0)
return1;

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

voidtrial(charflag[],inti,intn)...{
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);
}
}
}
}

voidmain()...{
charflag[6];
intn=6;
//power(flag,1,n);
trial(flag,0,n);
}
上面的解法是对状态空间进行先根遍历的过程。
类似的问题有:骑士,迷宫等等。
本文介绍了一种基于状态空间搜索的方法,用于解决幂集求解和N皇后问题,并提供了详细的C语言实现代码。此外还提到了这种方法可以应用于骑士、迷宫等其他问题。
1548

被折叠的 条评论
为什么被折叠?



