【算法競賽 入門經典】習題3-5 謎題(Uva227)

一、題目

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

二、解題思路

可以理解爲輸入一個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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章