控制台乱码问题
本质原因
Windows系统下
默认控制台编码格式为936(ANSI/OEM - 简体中文 GBK)
而C程序文件默认编码格式为utf-8
由于编码格式不一致,程序运行时会出现中文乱码
解决方法
修改源码 使用系统调用
增添头文件
主动设置控制台输出的编码为utf-8格式
另存为
记事本打开C程序文件,点击【文件】–【另存为】,选择ANSI编码格式并替换原文件
vscode
如果是在vs code运行出现中文乱码,一般是将编码格式从utf-8修改为gbk、gb2312或者gb18030等即可
空格: 报错 illegal character U+00A0
n 滑块游戏,第二部分是 2n+1
个字符,表示该游戏的某个格局
如果不是目标格局,则按顺序(将格局看作字符串后,按照字典序排序,即
B < E < W)输出该格局的所有后继格局。例如,BBEBWWW 格局应该排在
BBWBWEW 格局的前面。
#include<iostream>
#include<cstring>
using namespace std;
//将数组的第i个元素和第j个元素互换
void swap(char str[], int i, int j) {
char ch = str[i];
str[i] = str[j];
str[j] = ch;
}
// 将result数组的 前counter行 进行冒泡排序
void bubbleSort(char result[][20], int counter, int length) {
char str[20];
for (int i = counter - 1; i > 0; i--) // 从第 counter个开始
for (int j = 0; j < i - 1; j++)
if (strcmp(result[j + 1], result[j]) < 0) {
strcpy(str, result[j]);
strcpy(result[j], result[j + 1]);
strcpy(result[j + 1], str);
}
}
//判断sliders是否为目标格局
bool check(char* sliders,int length) {
int wMaxIndex = 0;//最后一个白色将牌的下标
int bMinIndex = 0;//第一个黑色将牌的下标
for (int i = 0; i < length; i++) {
if (sliders[i] == 'W')
wMaxIndex = i;
else if (sliders[i] == 'B')
bMinIndex = i;
}
if (wMaxIndex < bMinIndex)
return true;
return false;
}
int main() {
//假设输入的最大格局数是6,每个格局的最大长度是20
const int MAX_N = 6;//输入的最大格局数
const int MAX_LEN = 20;//每个格局的最大长度
char buffer[MAX_N][MAX_LEN];//假设输入的格局不超过6个,每个格局不超过20个字符。
int N;
cin >> N; //3
for (int i = 0; i < N; i++) {
int numSlider;
cin >> numSlider;
cin >> buffer[i];
}
for (int k = 0; k < N; k++) {
//对每一个格局进行遍历处理
int counter = 0; //记录该格局的后继格局数
int length = strlen(buffer[k]); //length是当前格局的长度
char sliders[20];
char result[10][20]; //存放该格局的所有后继格局,假设不超过10个
cout << "结果_" << k + 1 << endl;
strcpy(sliders, buffer[k]); //将当前格局复制到sliders中
if (check(sliders,length)) {
//检查当前格局是否为目标格局
cout << "目标格局" << endl;
continue;
}
for (int i = 0; i < 10; i++) {
// 将当前格局复制到二维数组result的每一维上
strcpy(result[i], sliders);
}
int index = 0;
for (; index < length; index++) {
// 查找空格字符E的下标
if (sliders[index] == 'E')
break; // index 指向 E
}
for (int offset = 1; offset < 4; offset++) {
if (index + offset < length) {
// E 向右找 1 2 3
swap(result[counter], index, index + offset); //将空格和它右边的将牌交换
counter++;
}
if (index - offset >= 0) {
// E 向左找 1 2 3
swap(result[counter], index, index - offset); //将空格和它左边的将牌交换
counter++;
}
}
bubbleSort(result, counter, length); // 当前格局的所有后继格局排序
for (int m = 0; m < counter; m++) // 输出当前格局的所有后继格局
cout << result[m] << endl;
}
return 0;
}