(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(int i = 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); //the i element exists flag[i-1] = '1'; power(flag, i+1, n); //the i element does not exist 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(int k = 0; k < i; k++)...{ if(flag[k] == j)...{ return 0; } } return 1;} /**/ /** * 是否在同一对角线? * 0:是 * 1:否 */ int checkDiag( char flag[], int i, char j) ... { if(i == 0) return 1; if(flag[i-1] == j - 1 || flag[i-1] == j + 1)...{ return 0; }else...{ return 1; }} void trial( char flag[], int i, int n) ... { if(i >= n)...{ //print current solution for(int i = 0; i < n; i++)...{ printf("%c", flag[i]); } printf(" "); }else...{ for(char j = '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() ... { char flag[6]; int n = 6; //power(flag, 1, n); trial(flag, 0, n);} 上面的解法是对状态空间进行先根遍历的过程。 类似的问题有:骑士,迷宫等等。