谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)
问题描述:有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指 令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指 令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示
#include <stdio.h>
#define H 5
#define W 5
void show(char alpha[H][W]){ //显示矩阵
for(int i = 0; i<H; i++)
for(int j = 0; j<W; j++)
{
printf("%c ",alpha[i][j]);
if(j == 4) printf("\n");
}
}
int main(){
//定义原始矩阵并展示
char alpha[H][W];
for(int i = 0; i<H; i++)
for(int j = 0; j<W; j++)
alpha[i][j] = 5*i + j + 'A';
alpha[2][2] = ' ';
show(alpha);
int x=2, y = 2; //定义空格
char b;
while(scanf("%c", &b)==1 && b!='0'){
switch(b){
case 'a':
alpha[x][y] = alpha[x-1][y];
alpha[x-1][y] = ' ';
x--; break;
case 'b':
alpha[x][y] = alpha[x+1][y];
alpha[x+1][y] = ' ';
x++; break;
case 'l':
alpha[x][y] = alpha[x][y-1];
alpha[x][y-1] = ' ';
y--; break;
case 'r':
alpha[x][y] = alpha[x][y+1];
alpha[x][y+1] = ' ';
y++; break;
default:
printf("This puzzle has no final configuration.\n");
return 0;
}
}
if(x<H && x>-1 && y<W && y>-1) show(alpha); //判断是否越界
else printf("This puzzle has no final configuration.\n");
return 0;
}