软考--下午题试题四--较难

179 阅读2分钟

1.分治

//
// Created by zg on 2023/10/5.
//
#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皇后问题

//
// Created by zg on 2023/10/5.递归实现
//
#include <stdio.h>
#include<math.h>
#define N 4

int q[N+1];// 存储皇后的列号

int answer = 0; //方案数

int check(int j){ //检查第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){ //求解N皇后方案
    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){ //检查第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(){ //求解N皇后方案
    int i ;
    for ( i = 0; i <= N; ++i) {
        q[i] = 0;
    }
    int answer = 0; //方案数

    int j = 1; //表示正在摆放第j个皇后
    while (j >= 1){
        q[j] = q[j] + 1;// 让第j个皇后向后一列摆放

        while (q[j] <= N && !check(j)){ //判断第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{//表示第j个皇后找不到一个合法的摆放位置
            q[j] = 0; //还原第j个皇后的位置
            j = j - 1;//回溯
        }
    }
}
int main() {
   queen();
    return 0;
}

在这里插入图片描述

3.动态规划

在这里插入图片描述