贴两个题目链接,我就不粘题目了,自己去看吧。
https://vjudge.net/problem/UVA-227
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=163
下面是AC代码:
//自己的代码(#^.^#) #include<stdio.h> #include<string.h> int a,b,n=0,k; char d,x[6][6]; void Move() { k=0; while((d=getchar())!='0') { if(k==0) { if(d=='A') { if(a<1) { k=1; continue; } else { x[a][b]=x[a-1][b]; a=a-1; } } else if(d=='B') { if(a>3) { k=1; continue; } else { x[a][b]=x[a+1][b]; a=a+1; } } else if(d=='L') { if(b<1) { k=1; continue; } else { x[a][b]=x[a][b-1]; b=b-1; } } else if(d=='R') { if(b>3) { k=1; continue; } else { x[a][b]=x[a][b+1]; b=b+1; } } } } getchar(); } int main() { while(1) { //第一部分 for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { x[i][j]=getchar(); if(x[i][j]=='Z') return 0; if(x[i][j]==' ') { a=i,b=j; } } getchar(); } //第二部分 Move(); //第三部分 if(n) printf("\n"); printf("Puzzle #%d:\n",++n); if(k) printf("This puzzle has no final configuration.\n"); else { x[a][b]=' '; for(int i=0; i<5; i++) { printf("%c %c %c %c %c\n",x[i][0],x[i][1],x[i][2],x[i][3],x[i][4]); } } } return 0; }
思路:
题目可以分成三个部分来看。
第一,输入原始的5*5网格。存入一个字符串数组,注意换行符的读取。
第二,空格字符的移动。判断语句注意逻辑关系,只需要把空格要移动过去的那个方格的值赋给现在的空格就可以,不用再把空格赋值到下一个位置,注意最后一个0结束后还会有换行符,并给确定的空格位置赋值。
第三,输出。相邻两个different puzzle之间要空一行,每行两个相邻的网格中间要空一格。
参数:
int a,b,n=0,k; char d,x[6][6];
a和b用来记录空格的位置,n用来记录an appropriately labeled number,k用来判断移动过程中网格是否有效,d用来放输入的移动字符,x二维数组用来存放网格数据。
小结:
仔细理解上下文逻辑,注意数据初始化,这题真的磨光了我的耐心,刚开始怎么都是WA真滴难受。
(#^.^#)
附一下样例的INPUT测试数据:
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z