问题展示
代码展示
#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;
}
代码解析:
- 变量声明:
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;
这里设置了两个指针l
和r
,分别指向数组的开始和结束。s
用于记录找到的匹配字符的索引,初始化为-1。
5.
——主循环:
while (l < r) {
这个循环将一直执行,直到l
和r
相遇或交叉。
——检查首尾字符是否相等:
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]
相等,或者已经通过交换使它们相等,移动指针l
和r
,继续检查下一对字符。
6.处理不可能的情况:
fish: printf("Impossible");
如果操作次数超过8000,程序将跳转到fish
标签处,输出"Impossible"。