(UVa 227) Puzzle(字符输入输出+坑)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Africa_South/article/details/102078706

原题: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
*/

猜你喜欢

转载自blog.csdn.net/Africa_South/article/details/102078706
今日推荐