算法竞赛入门经典(第2版) Puzzle UVa 227
程序员文章站
2024-03-19 19:00:58
...
Puzzle UVa 227
题目:
大意:有一个55的网格,其中恰好有一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(分别以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration."
思路:定义posi和posj来记录空格位置,根据输入指令如果符合条件进入不同的if,将空格位置与目标位置交换。PS:注意输入输出!!
Sample Input
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z
Sample Output
Puzzle #1:
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
Puzzle #2:
A B C D
F G H I E
K L M N J
P Q R S O
T U V W X
Puzzle #3:
This puzzle has no final configuration.
#include <bits/stdc++.h>
#define maxn 5
#pragma warning(disable:4996);
using namespace std;
char a[maxn][maxn], b;
void swap(char &a, char &b) {
char temp = a;
a = b;
b = temp;
}
int main(){
int kase = 1;
int posi = 0, posj = 0;
while(1) {
bool flag = true;
for(int i = 0; i < 5; i++) { //输入5*5二维数组
for(int j = 0; j < 5; j++) {
scanf("%c", &a[i][j]);
if(a[0][0] == 'Z') //当输入Z时退出
return 0;
if(a[i][j] == ' ') { //记录空格的位置
posi = i;
posj = j;
}
}
getchar();
}
while((b=getchar()) != '0') {
if(b == 'A' && posi-1 >= 0) {
swap(a[posi][posj],a[posi-1][posj]);
--posi;
}
else if(b == 'B' && posi+1 <= 4) {
swap(a[posi][posj],a[posi+1][posj]);
++posi;
}
else if(b == 'L' && posj-1 >= 0) {
swap(a[posi][posj],a[posi][posj-1]);
--posj;
}
else if(b == 'R' && posj+1 <= 4) {
swap(a[posi][posj],a[posi][posj+1]);
++posj;
}
else if(b != '\n') flag = false;
}
getchar();
if(kase != 1) printf("\n");
printf("Puzzle #%d:\n", kase++);
if(flag == false) {
printf("This puzzle has no final configuration.\n");
}
else {
for(int i = 0; i < 5; i++) {
printf("%c", a[i][0]);
for(int j = 1; j < 5; j++) {
printf(" %c", a[i][j]);
}
printf("\n");
}
}
}
return 0;
}