一、題目
二、解題思路
可以理解爲輸入一個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;
}