原题:https://vjudge.net/problem/UVA-227
题目大意
题目分析
很简单的到入门题目,涉及到字符(串)的输入和输出,坑比较多,下面贴出我的踩过的坑:
- scanf(“c”)输入字符遇到回车、空格、换行都会停止,但是输入的地图中有空格,所以我使用
getchar()
逐个字符进行输入,但是需要判断很多情况 - 若空格方块在某一行的最后,则输入的是
'\n'
,需要将其转换成' '
,其他情况将读入的换行丢弃 - 最后移动序列的
0
前可能有很多'\n'
,都是我们不需要的 - 注意使用getchar()读取时,每一行末尾都会有一个
'\n'
,需要考虑是否有影响 - 最后,输出除了最后一个样例外,其它样例后都需要多输出一个空行进行分割
#include<stdio.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<ctype.h>
#include<iostream>
using namespace std;
// 暴力求解
const string mess = "This puzzle has no final configuration.";
char map[5][5]; // 网格
char mov; // 移动操作
void showMap() {
for (int i = 0; i < 5; i++) {
printf("%c", map[i][0]);
for (int j = 1; j < 5; j++) {
printf(" %c", map[i][j]);
}
printf("\n");
}
}
int main() {
char c;
int x, y; // 空格的起始位置
int kcase = 1;
int line = 1; // 第一行
while (1) {
// 先输入第一个
c = getchar();
while (c == '\n') c = getchar();
if (c == 'Z') break;
// 输入地图
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
while (c == '\n' && j != 4) c = getchar();
if (c == '\n') c = ' ';
map[i][j] = c; //注意若空格在一行的最后一个,则输入的是'\n'
if (c == ' ') {
x = i; y = j;
}
c = getchar(); // 最后会把最后一行的'\n'吸收掉
}
}// 地图输入完毕
// 输入指令
int flag = 0; // 是否有差错
while ((mov = getchar()) && mov != '0') {
// 如果是换行可以跳过
if (flag == 1 || mov == '\n') continue;
int m = x, n = y; // 空格的下一位位置
switch (mov) {
case 'A': m--; break;
case 'B': m++; break;
case 'L': n--; break;
case 'R': n++; break;
}
if ((m < 0 || m > 4) || (n < 0 || n > 4)) flag = 1;
else { // 开始移动
char tmp = map[x][y];
map[x][y] = map[m][n];
map[m][n] = tmp;
//printf("(%d,%d)->(%d,%d)\n", x, y, m, n);
x = m;
y = n;
}
}
getchar(); // 0末尾还有一个换行,也可以不读入,因为之前有判断
if (line != 1) printf("\n"); line++;
printf("Puzzle #%d:\n", kcase); kcase++;
if (flag == 0) showMap();
else printf("%s\n", mess.c_str());
}
return 0;
}
/*
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z
*/