蓝桥杯真题——完美的代价

问题展示


代码展示

#include <stdio.h>
int main() {
    int n,count=0;
    char arr[10] = { 0 };
    char c;
    int j=0;
    scanf_s("%d", &n);
    getchar();
    while (n) {
        c = getchar();
        arr[j++] = c;
        n--;
    }
    int r = j-1;

    int l = 0; 
    int m;
    int s = -1;
        while (l < r) {
            if (arr[l] != arr[r]) {
            again:
                for (m = r - 1; m >= 0; m--) {
                    if (arr[l] == arr[m]) {
                        s = m;
                        break;
                    }
                }
                for (int v = 0, i = 1; i <= r - s; i++, v++) {
                    char temp = arr[r - v];
                    arr[r - v] = arr[r - i];
                    arr[r - i] = temp;

                    count++;
                    if (arr[l] == arr[r]) {
                        break;
                    }
                    if (count > 8000) {
                        goto fish;
                    }
                }

                if (arr[l] != arr[r]) {
                    goto again;
                }


            }
            r--;
            l++;
        }
    

    for (int x = 0; x < j; x++) {
        printf("%c", arr[x]);
    }
    putchar('\n');
    printf("%d", count);
fish:
    printf("Impossible");
    return 0;
}

代码解析:

  1. 变量声明:

int n, count = 0;
char arr[10] = { 0 };
char c;
int j = 0;

  • n:用于存储用户将要输入的字符数量。
  • count:用于记录字符交换的次数,初始化为0。
  • arr:一个字符数组,用于存储输入的字符,大小为10,初始化为0。
  • c:一个字符变量,用于临时存储从标准输入读取的字符。
  • j:一个整型变量,用作数组arr的索引,初始化为0。

2.读取字符数量

scanf_s("%d", &n);
getchar();

使用scanf_s函数读取用户输入的整数n,表示将要输入的字符数量。getchar用于读取并丢弃缓冲区中的换行符。

3.读取字符并存储到数组:

while (n) {
    c = getchar();
    arr[j++] = c;
    n--;
}

4.设置左右指针

int r = j - 1;
int l = 0;
int m;
int s = -1;

这里设置了两个指针lr,分别指向数组的开始和结束。s用于记录找到的匹配字符的索引,初始化为-1。

5.

——主循环

while (l < r) {

这个循环将一直执行,直到lr相遇或交叉。

——检查首尾字符是否相等

if (arr[l] != arr[r]) {

如果首尾字符不相等,进入下面的循环。

for (m = r - 1; m >= 0; m--) {
    if (arr[l] == arr[m]) {
        s = m;
        break;
    }
}

从右向左查找与arr[l]相等的字符,并记录其索引s

for (int v = 0, i = 1; i <= r - s; i++, v++) {
    char temp = arr[r - v];
    arr[r - v] = arr[r - i];
    arr[r - i] = temp;
    count++;
    if (arr[l] == arr[r]) {
        break;
    }
    if (count > 8000) {
        goto fish;
    }
}

这个循环用于交换字符,使得arr[l]arr[r]相等。如果交换后arr[l]arr[r]相等,或者操作次数超过8000,则跳出循环。

——检查是否需要继续交换

if (arr[l] != arr[r]) {
    goto again;
}

如果arr[l]arr[r]仍然不相等,跳转到again标签,继续查找和交换。

——移动指针

r--;
l++;

如果arr[l]arr[r]相等,或者已经通过交换使它们相等,移动指针lr,继续检查下一对字符。

6.处理不可能的情况

fish:
printf("Impossible");

如果操作次数超过8000,程序将跳转到fish标签处,输出"Impossible"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值