本人写了小十天就干这个(我太菜了那个紫皮书出这么恶心的题本身代码逻辑并不难,我也写出来了但是就算有问题我ccccccccccccccc)
首先说一下我不讲这个,因为我本身vs没有运行出来正确结果,在第二个输入中我输入的这个多出一个空格,我就算是再vj里面用别人的代码也是有问题,我就想算了不较真了,应该是vs的环境问题放在了vj这里说我超时我也就先放放吧等我过一阵子再从新检查这个代码。这篇文章就当是给我提提醒了,纱布题目我ccccccccccccccccccccccc
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char puzzle[10][10]; // 代表拼图的全局数组
int emptyX, emptyY; // 用于存储空格的位置
void fillAndFindEmpty() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
puzzle[i][j] = getchar(); // 获取输入字符
}
getchar(); // 读取每行末尾的换行符
}
// 查找空格的位置
int ei = 0, ej = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (puzzle[i][j] == ' ') {
ei = i;
ej = j;
break;
}
}
if (puzzle[ei][ej] == ' ') break; // 找到空格后退出外层循环
}
emptyX = ei;
emptyY = ej;
}
int main() {
int kase = 0;
while (true) {
fillAndFindEmpty();
string commands;
getline(cin, commands); // 读取命令字符串
if (commands.empty()) continue; // 如果没有命令行,继续读取
bool flag = true; // 标志变量初始化为 true
for (char command : commands) {
if (command == '0') {
break;
}
if (command == 'Z') {
return 0;
}
// 进行边界检查和移动操作
switch (command) {
case 'A': // 上移
if (emptyX > 0) {
char t = puzzle[emptyX - 1][emptyY];
puzzle[emptyX - 1][emptyY] = puzzle[emptyX][emptyY];
puzzle[emptyX][emptyY] = t;
emptyX--;
}
else {
flag = false;
}
break;
case 'B': // 下移
if (emptyX < 4) {
char t = puzzle[emptyX + 1][emptyY];
puzzle[emptyX + 1][emptyY] = puzzle[emptyX][emptyY];
puzzle[emptyX][emptyY] = t;
emptyX++;
}
else {
flag = false;
}
break;
case 'L': // 左移
if (emptyY > 0) {
char t = puzzle[emptyX][emptyY - 1];
puzzle[emptyX][emptyY - 1] = puzzle[emptyX][emptyY];
puzzle[emptyX][emptyY] = t;
emptyY--;
}
else {
flag = false;
}
break;
case 'R': // 右移
if (emptyY < 4) {
char t = puzzle[emptyX][emptyY + 1];
puzzle[emptyX][emptyY + 1] = puzzle[emptyX][emptyY];
puzzle[emptyX][emptyY] = t;
emptyY++;
}
else {
flag = false;
}
break;
default:
flag = false;
break;
}
if (!flag) {
break;
}
}
// 输出最终的拼图状态
if (flag) {
if (kase++) {
cout << '\n'; // 输出空行以分隔不同的拼图
}
cout << "Puzzle #" << kase << ":\n";
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j > 0) {
cout << ' ';
}
cout << puzzle[i][j];
}
cout << endl;
}
}
else {
cout << "This puzzle has no final configuration." << endl;
}
}
return 0;
}