2016-07-03
UVA - 227 Puzzle
题目大意:5×5 网格,有一个格子是空的,其他都是字母。一共四种指令:A,B,L,R,分别表示将空格上、下、左、右的字母移到空格中。输入网格和指令(以 0 结束),输出执行指令后的网格。
解题思路:二维数组模拟网格,用一个 char 类型的变量一边读一边执行,读入 0 结束。
注意:标记非法跳出后实际上并未读入完全,剩余指令会影响下一次的网格。读入时要十分注意!!!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void swap(char &a, char &b) {
char c ;
c = a;
a = b;
b = c;
}
int main() {
int n = 1;
char puzzle[6][6];
char a;
int x, y,temp = 0;
while (1) {
puzzle[0][0] = getchar();
if (puzzle[0][0] == 'Z') break;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 0 && j == 0) continue;
puzzle[i][j] = getchar();
}
if (puzzle[i][4] == '\n')
continue;
getchar();
}
for (int i = 0; i < 5; i++) {
if (puzzle[i][4] == '\n') {
puzzle[i][4] = ' ';
puzzle[i][5] = '\0';
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if(puzzle[i][j] == ' '){
x = i;
y = j;
}
}
}
while ( scanf("%c",&a) && a != '0' ) {
switch (a) {
case 'A':
if (x - 1 < 0) {
if ( n != 1 ) printf("\n");
printf("Puzzle #%d:\n", n);
printf("This puzzle has no final configuration.\n");
temp++;
break;
}
swap(puzzle[x][y], puzzle[x - 1][y]);
break;
case 'B':
if (x + 1 > 4) {
if ( n != 1 ) printf("\n");
printf("Puzzle #%d:\n", n);
printf("This puzzle has no final configuration.\n");
temp++;
break;
}
swap(puzzle[x][y], puzzle[x + 1][y]);
break;
case 'L':
if (y - 1 < 0) {
if ( n != 1 ) printf("\n");
printf("Puzzle #%d:\n", n);
printf("This puzzle has no final configuration.\n");
temp++;
break;
}
swap(puzzle[x][y], puzzle[x][y - 1]);
break;
case 'R':
if (y + 1 > 4) {
if ( n != 1 ) printf("\n");
printf("Puzzle #%d:\n", n);
printf("This puzzle has no final configuration.\n");
temp++;
break;
}
swap(puzzle[x][y], puzzle[x][y + 1]);
break;
}
if (temp) break;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (puzzle[i][j] == ' ') {
x = i;
y = j;
}
}
}
}
if (temp) {
while ( a != '0' ) scanf("%c",&a);
temp = 0;
a = '0';
getchar();
n++;
continue;
}
if ( n != 1 ) printf("\n");
printf("Puzzle #%d:\n", n);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
printf("%c ", puzzle[i][j]);
}
printf("%c\n", puzzle[i][4]);
}
a = '0';
getchar();
n++;
}
return 0;
}