题目链接:
https://cn.vjudge.net/problem/UVA-227
1 /* 2 问题 输入一个5*5的方格,其中有一些字母填充,还有一个空白位置,输入一连串 3 的指令,如果指令合法,能够得到一个移动后的方格就输出方格,不能就输出 4 “This puzzle has no final configuration.” 5 6 解题思路 7 模拟,一个一个的读入字符,包括空格,再读入若干行指令,如果指令表面合法,进入模拟看内容是否合法,不合法直接输出提示。 8 9 易错点 10 读入和控制结束问题,注意读入指令后有一个换行需要处理 11 输出格式,将换行放在谜题数前面 12 */ 13 #include<cstdio> 14 #include<cstring> 15 16 int check(char *s); 17 int move(char e[][11],int x, int y,char *s); 18 int main() 19 { 20 char e[11][11],s1[100],s[1100],ch; 21 int i,j,flag,t=0,x,y,lens; 22 while(1){ 23 for(i=1;i<=5;i++){ 24 gets(e[i]+1); 25 if(i == 1 && e[1][1] == 'Z'){ 26 return 0;//控制结束 27 } 28 } 29 30 //整合指令 31 memset(s,0,sizeof(char)*1100); 32 memset(s1,0,sizeof(char)*100); 33 while(1){ 34 scanf("%s",s1); 35 strcat(s,s1); 36 lens=strlen(s); 37 if(s[lens-1] == '0') 38 break; 39 } 40 getchar();//注意吃掉一个换行 41 42 //找到空白位置 43 for(i=1;i<=5;i++){ 44 for(j=1;j<=5;j++){ 45 if(e[i][j] == ' '){ 46 x=i; 47 y=j; 48 } 49 } 50 } 51 52 if(t != 0)//注意格式 53 printf(" "); 54 55 printf("Puzzle #%d: ",++t); 56 if(check(s)){ 57 if(move(e,x,y,s)) 58 for(i=1;i<=5;i++){ 59 for(j=1;j<=5;j++){ 60 if(j == 1) 61 printf("%c",e[i][j]); 62 else 63 printf(" %c",e[i][j]); 64 } 65 printf(" "); 66 } 67 else 68 printf("This puzzle has no final configuration. "); 69 } 70 else 71 printf("This puzzle has no final configuration. "); 72 } 73 return 0; 74 } 75 76 int move(char e[][11],int x, int y,char *s){ 77 int len=strlen(s),i; 78 for(i=0;i<len-1;i++){ 79 if(s[i] == 'A'){ 80 if(x-1 < 1) return 0; 81 e[x][y]=e[x-1][y]; 82 e[x-1][y]=' '; 83 x--; 84 } 85 else if(s[i] == 'B'){ 86 if(x+1 > 5) return 0; 87 e[x][y]=e[x+1][y]; 88 e[x+1][y]=' '; 89 x++; 90 } 91 else if(s[i] == 'R'){ 92 if(y+1 > 5) return 0; 93 e[x][y]=e[x][y+1]; 94 e[x][y+1]=' '; 95 y++; 96 } 97 else if(s[i] == 'L'){ 98 if(y-1 < 1) return 0; 99 e[x][y]=e[x][y-1]; 100 e[x][y-1]=' '; 101 y--; 102 } 103 } 104 return 1; 105 } 106 107 int check(char *s) 108 { 109 int len=strlen(s),i; 110 for(i=0;i<len-1;i++){ 111 if(s[i] != 'A' && s[i] != 'B' && s[i] != 'R' && s[i] != 'L') 112 return 0; 113 } 114 return 1; 115 }