題目:
acm.hust.edu.cn/vjudge/roblem/viewProblem.action?id=19191
這道題本身難度不大,但輸入輸出時需要特別小心,一不留神就會出問題。
對於輸入,如果要讀入一行時:
沒有空白字符,則直接使用scanf和%s即可;
有空白字符,使用gets,但要小心溢出;fgets一直不能正常工作,有待研究(gets會將緩沖區多余的\n扔掉,fgets會保留在字符串中);
對於要讀入單個字符時:
使用scanf和“ %c”進行捨棄空白字符(注意空格),並且最後需要getchar來吃掉最後的回車;
scanf和“%c”會讀入空白字符,和getchar相同。
只忽略回車,不忽略空格時,可將getchar放在以c==‘\n'為循環條件的do while中。
我心中的理想代碼如下:
1 #include<stdio.h>
2 #include<string.h>
3 const int LEN=5;
4 const int MAX=100;
5 const int y[]={0,0,1,-1};
6 const int x[]={-1,1,0,0};
7 char map[LEN][LEN];
8 int tra[110];
9 bool legal(int pos){
10 return 0<=pos&&pos<LEN;
11 }
12 void Pmap(){
13 for(int cow=0;cow<LEN;cow++){
14 printf("%c",map[cow][0]);
15 for(int col=1;col<LEN;col++)
16 printf(" %c",map[cow][col]);
17 printf("\n");
18 }
19 }
20 int main(){
21 tra['A']=0;
22 tra['B']=1;
23 tra['R']=2;
24 tra['L']=3;
25
26 bool first=true;
27 int Case=0;
28 //freopen("in","r",stdin);
29 //freopen("out","w",stdout);
30 int bx,by;
31 while(gets(map[0])){
32 if(map[0][0]=='Z')break;
33 for(int col=1;col<LEN;col++)
34 gets(map[col]);
35 for(int i=0;i<LEN;i++)
36 for(int j=0;j<LEN;j++)
37 if(map[i][j]==' '){
38 bx=i;by=j;
39 }
40 bool ok=true;
41 char c;
42 while(scanf(" %c",&c),c!='0'){
43 if(!ok)continue;
44 int nx=bx+x[tra[c]],ny=by+y[tra[c]];
45 if(!legal(nx)||!legal(ny)){
46 ok=false;
47 continue;
48 }
49 map[bx][by]=map[nx][ny];
50 map[nx][ny]=' ';
51 bx=nx;by=ny;
52 }
53 getchar();
54 if(first)
55 first=false;
56 else
57 printf("\n");
58 printf("Puzzle #%d:\n",++Case);
59 if(ok)
60 Pmap();
61 else
62 printf("This puzzle has no final configuration.\n");
63 }
64 return 0;
65 }