1.分治
#include <stdio.h>
#include <sched.h>
void Merge(int A[], int p, int q, int r){
int i,j,k;
int L[50],R[50];
int n1 = q-p+1,n2 = r-q;
for (i = 0; i < n1; ++i) {
L[i] = A[p+i];
}
for (j = 0; j< n2;j++){
R[j] = A[q+j+1];
}
L[n1] = INT_MAX;
R[n2] = INT_MAX;
i=0;
j=0;
for (k = p; k < r + 1 ; k++) {
if(L[i] < R[j]){
A[k] = L[i];
i++;
}else{
A[k] = R[j];
j++;
}
}
}
void MergeSort(int A[],int p, int r){
int q;
if(p<r){
q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
}
int main(){
int A[] = {4,1,3,6,7,5,2,9};
MergeSort(A,0,7);
for (int i = 0; i < 8; ++i) {
printf("%d",A[i]);
}
return 0;
}

2.N皇后问题
#include <stdio.h>
#include<math.h>
#define N 4
int q[N+1];
int answer = 0;
int check(int j){
int i ;
for ( i = 1; i < j; ++i) {
if(q[i] == q[j] || abs(i-j) == abs(q[i]-q[j])){
return 0;
}
}
return 1;
}
void queen(int j){
int i ;
for ( i = 1; i <= N; ++i) {
q[j] = i;
if(check(j)){
if(j == N){
answer = answer + 1;
printf("方案%d:",answer);
for ( i = 1; i <= N; ++i) {
printf("%d",q[i]);
}
printf("\n");
}else{
queen(j + 1);
}
}
}
}
int main(){
queen(1);
return 0;
}
#include <stdio.h>
#include<math.h>
#define N 4
int q[N+1];
int check(int j){
int i ;
for ( i = 0; i < j; ++i) {
if(q[i] == q[j] || abs(i-j) == abs(q[i]-q[j])){
return 0;
}
}
return 1;
}
void queen(){
int i ;
for ( i = 0; i <= N; ++i) {
q[i] = 0;
}
int answer = 0;
int j = 1;
while (j >= 1){
q[j] = q[j] + 1;
while (q[j] <= N && !check(j)){
q[j] = q[j] + 1;
}
if(q[j] <= N){
if(j == N){
answer = answer + 1;
printf("方案%d:",answer);
for ( i = 1; i <= N; ++i) {
printf("%d",q[i]);
}
printf("\n");
}else{
j = j + 1;
}
}else{
q[j] = 0;
j = j - 1;
}
}
}
int main() {
queen();
return 0;
}

3.动态规划
