欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法竞赛入门经典(第2版) Puzzle UVa 227

程序员文章站 2024-03-19 19:00:58
...

Puzzle UVa 227

题目:算法竞赛入门经典(第2版) 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; 
}