Raspercival 2026-01-10 16:50 采纳率: 0%
浏览 5

请指出我该如何改进我的算法

我有一道题目,只能写出六十分,没有任何编译错误和时间超限。
题目是这样的

img

img

img

#include<stdio.h>
#include<string.h>

int main() {
    int time;
    scanf("%d", &time);
    getchar();
    int vectors[4][2] = { {1,0},{0,1},{1,1},{1,-1} };//下,右,右下,左下
    for (int i = 0; i < time; i++) {
        char board[20][21] = { 0 };
        for (int j = 0; j < 20; j++) {
            scanf("%s", board[j]);
        }
        //此时我已经把整张地图输入了
        //开始进行后手判断,能不能一步下死先手
        int can_lose = 0;
        for (int j = 0; j < 20; j++) {
            for (int k = 0; k < 20; k++) {
                if (board[j][k] == '*') {
                    int found_next = 1;
                    int lose_x = j;
                    int lose_y = k;
                    for (int d = 0; d < 4; d++) {
                        int lose_move_x = j;
                        int lose_move_y = k;
                        int found_empty = 0;
                        int found_ememy = 0;
                        for (int m = 0; m < 4; m++) {
                            if (board[lose_move_x + vectors[d][0]][lose_move_y + vectors[d][1]] == '*') {
                                found_next++;
                            }
                            else if (board[lose_move_x + vectors[d][0]][lose_move_y + vectors[d][1]] == '_') {
                                found_empty++;
                            }
                            else {
                                if (m < 3) {
                                    found_ememy++;
                                }
                            }
                            lose_move_x += vectors[d][0];
                            lose_move_y += vectors[d][1];
                        }
                        if (found_next == 4 && found_ememy == 0) {//存在连续四个*
                            if (found_empty == 1) {
                                can_lose = 1;
                            }
                            else {
                                if (board[lose_x - vectors[d][0]][lose_y - vectors[d][1]] == '_') {
                                    can_lose = 1;
                                }
                            }
                        }
                        if (can_lose == 1) {
                            break;
                        }
                        found_next = 1;
                    }
                    
                }
                if (can_lose) {
                    break;
                }
            }
            if (can_lose) {
                break;
            }
        }
        if (can_lose) {
            printf("Lose\n");
            continue;
        }
        else {
            int can_win = 0;
            for (int j = 0; j < 20; j++) {
                for (int k = 0; k < 20; k++) {
                    if (board[j][k] == '#') {
                        int win_line = 0;
                        int found_now = 1;
                        int now_x = j;
                        int now_y = k;
                        int single_empty = 0;
                        int double_empty = 0;
                        for (int d = 0; d < 4; d++) {
                            int now_move_x = j;
                            int now_move_y = k;
                            while (board[now_move_x + vectors[d][0]][now_move_y + vectors[d][1]] == '#') {
                                found_now++;                                
                                now_move_x += vectors[d][0];
                                now_move_y += vectors[d][1];
                                if (found_now == 4) {
                                    win_line++;
                                    if (board[now_move_x + vectors[d][0]][now_move_y + vectors[d][1]] == '_' && board[now_x - vectors[d][0]][now_y - vectors[d][1]] == '_') {
                                        double_empty++;
                                    }
                                    else if (board[now_move_x + vectors[d][0]][now_move_y + vectors[d][1]] == '_' || board[now_x - vectors[d][0]][now_y - vectors[d][1]] == '_') {
                                        single_empty++;
                                    }
                                    if (win_line == 1) {
                                        if (double_empty == 1) {
                                            can_win = 1;
                                        }
                                    }
                                    else if (win_line > 1) {
                                        if (double_empty >= 1 || single_empty >= 2) {
                                            can_win = 1;
                                        }
                                    }
                                    break;
                                }
                            }
                            if (can_win) {
                                break;
                            }
                            found_now = 1;
                        }
                    }
                    if (can_win) {
                        break;
                    }
                }
                if (can_win) {
                    break;
                }
            }
            if (can_win) {
                printf("Win\n");
            }
            else {
                printf("Not Sure\n");
            }
        }
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2026-01-10 16:51
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 目前仅给出了一个不完整的代码框架,没有具体的算法内容。所以无法直接判断算法的问题所在。
      - 从已有的代码看,没有具体的功能实现代码段,比如输入处理、核心算法逻辑、输出处理等部分缺位。
    2. 解决方案
      - 假设这是一个简单的字符串处理问题,例如统计字符串中某个字符出现的次数。完整代码如下:
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[100];
        char target;
        printf("请输入字符串:");
        scanf("%s", str);
        printf("请输入要统计的字符:");
        scanf(" %c", &target);
        int count = 0;
        for (int i = 0; i < strlen(str); i++) {
            if (str[i] == target) {
                count++;
            }
        }
        printf("字符 %c 在字符串中出现的次数为:%d\n", target, count);
    
        return 0;
    }
    
    • 如果是其他类型的问题,比如排序算法,示例代码如下(冒泡排序):
    #include <stdio.h>
    
    void bubbleSort(int arr[], int n) {
        int i, j;
        for (i = 0; i < n - 1; i++) {
            for (j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
    
    int main() {
        int arr[] = {64, 34, 25, 12};
        int n = sizeof(arr) / sizeof(arr[0]);
        bubbleSort(arr, n);
        printf("排序后的数组:\n");
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    
        return 0;
    }
    
    1. 多种解决方案的优缺点
      - 以字符串统计字符出现次数为例
      • 优点:简单直观,容易理解和实现。
      • 缺点:对于长字符串效率相对较低,因为每次都要遍历整个字符串。
      • 以冒泡排序为例
      • 优点:代码简单,比较次数直观。
      • 缺点:时间复杂度较高,为(O(n^2)),对于大规模数据排序效率很低。
    2. 总结
      - 要改进算法,首先需要明确具体的问题需求,然后根据需求选择合适的算法和数据结构。
      - 对于简单问题,选择直观的算法实现;对于复杂问题,可能需要考虑更高效的算法,如排序问题中可以选择快速排序等时间复杂度更低的算法((O(nlogn)))。同时,代码实现过程中要注意边界条件和错误处理等细节。

    由于原始问题没有给出具体算法内容,以上只是基于常见问题类型给出的示例解答,实际改进需要根据具体题目要求来进行。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月10日