题目:《算法竞赛入门经典》(第2版)刘汝佳 习题3-5 UVa227 P57
问题简述:
一个5×5的网格,一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列,指令序列以数字0结束,输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration."。
输入:
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
输出:略(按照好看的格式输出)
分析:1、这道题目没有什么思维上的难度,就是输入输出稍微长点。
2、一步步写代码。
3、先不要命令台输入代码,给谜题和命令初始化就好了。(谜题的输入)(便于调试)
4、按照指令移动方格(执行命令)(单独写个函数,用于执行正确的指令)
5、写一个专门的输出函数。(输出)(也可以用来一步步打印检测步骤4中的指令执行,
观察执行是否正确)
6、写语句,在命令台输入谜题和命令。//将步骤3注释掉
7、在步骤4中添加判断指令正确与否的语句。
8、over.
注:我对空格的处理是,打印空格的内容为“ ”;
代码:
#include<stdio.h>
#include<string.h>
void move(char puzz[][5],int *x,int *y,char com)
{
//检查指令是否合法
int flag=0;
if(com!='A'||'B'||'L'||'R') //输入的命令字符出错
flag=1;
if((com=='A'&&*x==0)||(com=='B'&&*x==4)||(com=='L'&&*y==0)||(com=='R'&&*y==4))
flag=1;//在边界的情况。
if(flag==1)
{
printf("This puzzle has no final configuration.");
exit(0);
}
//执行合法的指令
if(com=='A')
{
puzz[(*x)][*y]=puzz[*x-1][*y];
(*x)--;
}
if(com=='B')
{
puzz[(*x)][*y]=puzz[*x+1][*y];
(*x)++;
}//puzz[(*x)++][*y]=puzz[*x+1][*y];不要这么写
if(com=='L')
{
puzz[*x][(*y)]=puzz[*x][*y-1];
(*y)--;
}
if(com=='R')
{
puzz[*x][(*y)]=puzz[*x][*y+1];
(*y)++;
}
}
void print_puzz(char puzz[][5],int x,int y)
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(i==x&&j==y)
printf(" ");
else
printf("%c ",puzz[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
int len,i,j,x,y;//xy用来存储空格的位置
char puzz[5][5],com[30];
/*char puzz[5][5]={"TRGSJ",
"XDOKI",
"M VLN",
"WPABE",
"UQHCF"};
char com[30]="ARRBBL0";*/
for(i=0;i<5;i++)//输入谜题
{
for(j=0;j<5;j++)
{
puzz[i][j]=getchar();
}
getchar();//接收回车
}
i=0;
while((com[i++]=getchar())!='0');//输入命令,0也输入进去
len=strlen(com);
x=2;y=1;
print_puzz(puzz,x,y);
for(i=0;i<len-1;i++)//执行指令
{
move(puzz,&x,&y,com[i]);
//print_puzz(puzz,x,y);
}
print_puzz(puzz,x,y); //输出结果
return 0;
}
结果: