背景:做了两个多小时,各种出错,各种调试,看了是1993的final题。
学习1.结构体数据类型的定义:
typedef struct{
int x;
int y;
}place;
//使用该类型定义变量。
palce a,b;
2.输入序列一旦被判断为无效的,不应该立即退出,还要处理剩下的该输入序列中的元素,避免被当做下一个输入序列。
3.一旦有变量值可以超出数组界线的情况就一定不要让该变量作为数组下标,方法是先判断是否越界:
if(blank.x>4||blank.x<0||blank.y<0||blank.y>4) { casse=0; continue;} /<span style="font-size:18px;color:#FF0000;">/横纵坐标的上下界都判断为好。列如:不要因为这里是x--就只判断
x>0,有可能前面已经有x=6了,即使x--依然有x>4不满足。
</span>
#include<stdio.h>
typedef struct{
int x;
int y;
}place;
int main(void){
char puzzle[5][5];
int count=1;
while(1){
if(count-1) getchar();
puzzle[0][0]=getchar();
if(puzzle[0][0]=='Z') break;
for(int i=1;i<5;i++)
puzzle[0][i]=getchar();
for(int i=1;i<5;i++) {
getchar();
for(int ii=0;ii<5;ii++) puzzle[i][ii]=getchar();
}
place blank;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(puzzle[i][j]==' '){
blank.x=i;
blank.y=j;
}
int k=0;
int casse=1;
while(1){
if(!k) getchar();
k++;
char move;
scanf("%c",&move);
if(move=='\n') continue;
if(move=='0') break;
else if(move=='A'){
blank.x--;
if(blank.x>4||blank.x<0||blank.y<0||blank.y>4){ casse=0; continue;}
puzzle[blank.x+1][blank.y]=puzzle[blank.x][blank.y];
puzzle[blank.x][blank.y]=' ';
}
else if(move=='B'){
blank.x++;
if(blank.x>4||blank.x<0||blank.y<0||blank.y>4) { casse=0; continue;}
puzzle[blank.x-1][blank.y]=puzzle[blank.x][blank.y];
puzzle[blank.x][blank.y]=' ';
}
else if(move=='L'){
blank.y--;
if(blank.x>4||blank.x<0||blank.y<0||blank.y>4) { casse=0; continue;}
puzzle[blank.x][blank.y+1]=puzzle[blank.x][blank.y];
puzzle[blank.x][blank.y]=' ';
}
else if(move=='R'){
blank.y++;
if(blank.x>4||blank.x<0||blank.y<0||blank.y>4) { casse=0; continue;}
puzzle[blank.x][blank.y-1]=puzzle[blank.x][blank.y];
puzzle[blank.x][blank.y]=' ';
}
else { casse=0; continue;}
}
if(casse){
if(count-1) printf("\n");
printf("Puzzle #%d:\n",count++);
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j) printf(" ");
printf("%c",puzzle[i][j]);
}
printf("\n");
}
}
else {
if(count-1) printf("\n");
printf("Puzzle #%d:\n",count++);
printf("This puzzle has no final configuration.\n");
}
}
return 0;
}