一、题目
二、解题思路
可以理解为输入一个5x5的矩阵,然后其中有一个元素为空格,对于这个空格可以进行上下左右的移动(就是与上下左右的元素交换),分别对应A、B、L、R指令。其中指令以0结尾,整个输入以Z结尾。
需要注意的是,对换行符号的处理,用getchar处理掉换行符;然后就是指令的结尾,是以0结尾,并不是一行一个指令;最后就是输入的格式了,除了第一个,其他输出都需要在前面单独加一个换行符
三、代码
#include<stdio.h>
#include<string.h>
char str[5][5];
int main(){
char c=' ';
int x,y;
int count=0;
do{
int flag=1; //用于标记输入的指令是否合法
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
c=getchar();
str[i][j]=c;
if(c==' '){
x=i;
y=j;
}
if(c=='Z'){
return 0; //控制整个程序结束
}
}
getchar(); //处理掉输入每一行网格内容后产生的换行符
}
while((c=getchar()) && c!='0'){ //输入指令,以0结束
if(c=='A'){
if((x-1)>=0){
char t=str[x][y];
str[x][y]=str[x-1][y];
str[x-1][y]=t;
x=x-1;
}else{
flag=0;
}
}else if(c=='B'){
if((x+1)<5){
char t =str[x][y];
str[x][y]=str[x+1][y];
str[x+1][y]=t;
x=x+1;
}else{
flag=0;
}
}else if(c=='R'){
if((y+1)<5){
char t =str[x][y];
str[x][y]=str[x][y+1];
str[x][y+1]=t;
y=y+1;
}else{
flag=0;
}
}else if(c=='L'){
if((y-1)>=0){
char t =str[x][y];
str[x][y]=str[x][y-1];
str[x][y-1]=t;
y=y-1;
}else{
flag=0;
}
}
}
if(count>0){ //注意到格式要求
printf("\nPuzzle #%d:\n",++count);
}else{
printf("Puzzle #%d:\n",++count);
}
if(flag){
for(int i=0;i<5;i++){
printf("%c",str[i][0]);
for(int j=1;j<5;j++){
printf(" %c",str[i][j]);
}
printf("\n");
}
}else{
printf("This puzzle has no final configuration.\n");
}
getchar();//处理掉指令输入后的换行符
}while(c!='Z');
return 0;
}