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

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



