习题3-5谜题(Puzzle, UVa227)
AC代码
#include <stdio.h>
#include <string.h>
#define maxn 20
char s[maxn][maxn];
char c[100];
const char *u="This puzzle has no final configuration.";//定义错误输出结果
const char *uu="Puzzle #";//定义序号
int main()
{
int pp=1;//初始化
int gg=0;//初始化循环次数为0
int kk=0;//初始化
while(1)
{ gg++;int p1=0;int p2=0;//循环次数加1,声明p1和p2存储矩阵中' '的坐标
for(int i=0;i<=4&&pp;i++)
{
for(int j=0;j<=5&&pp;j++)
{
s[i][j]=getchar();//输入矩阵,注意在第一次循环中回车被存储在了每一行的第六个位置,第二次及以后的则会存储在每一行的第一个位置,这是因为一次循环结束对应的指令0后面含有一个回车,这个回车会存在下一次循环第一行的第一个位置中,第一行输入五个元素后的回车会存储在下一行的第一个位置,以此类推,每一行的第一个位置变成了回车,而不是第一次循环的第六个位置变成回车
if(s[i][j]==' ') {p1=i;p2=j;}//存储' '的坐标
if(s[i][j]=='Z') {pp=0;}//如果发现字符Z,跳出两层循环
}
}
if(pp==0) {break;}//出现了Z,跳出大循环结束程序
int zz=0;//声明一个序号
while((c[zz]=getchar())&&c[zz]!='0')//输入指令,指令为0时结束,注意回车也算指令
{zz++;}
int qq=1;//声明输出条件
if(gg!=1)printf("\n");//注意,第一次结果puzzle前没有空,后面的都有空
printf("%s%d:\n",uu,gg);//输出Puzzle #1~n:
for(int i=0;i<strlen(c);i++)
{
if(c[i]=='A') {if(p1!=0){s[p1][p2]=s[p1-1][p2];s[p1-1][p2]=' ';p1=p1-1;}else {printf("%s\n",u);qq=0;break;}}//' '与上方元素进行位置交换,条件:空白部分的上方必须具有元素,否则输出错误,跳出循环
else if(c[i]=='B') {if(p1!=4){s[p1][p2]=s[p1+1][p2];s[p1+1][p2]=' ';p1=p1+1;}else {printf("%s\n",u);qq=0;break;}}//' '与下方元素进行位置交换,条件:空白部分的下方必须具有元素,否则输出错误,跳出循环
else if(c[i]=='L') {if(p2!=kk){s[p1][p2]=s[p1][p2-1];s[p1][p2-1]=' ';p2=p2-1;}else {printf("%s\n",u);qq=0;break;}}//' '与左方元素进行位置交换,条件:空白部分的左方必须具有元素,否则输出错误,跳出循环;注意这里的kk变量,从第二次矩阵输入开始,回车被存在了第一个位置,相当于整个矩阵向右进行了平移
else if(c[i]=='R') {if(p2!=kk+4){s[p1][p2]=s[p1][p2+1];s[p1][p2+1]=' ';p2=p2+1;}else {printf("%s\n",u);qq=0;break;}}//' '与右方元素进行位置交换,条件:空白部分的右方必须具有元素,否则输出错误,跳出循环;注意这里的kk变量,从第二次矩阵输入开始,回车被存在了第一个位置,相当于整个矩阵向右进行了一个单位的平移
else if(c[i]=='0') {break;}//如果指令中出现了0,那结束对矩阵的操作
else if(c[i]=='\n') {continue;}//如果指令中出现了回车,那继续进行指令识别
else {printf("%s\n",u);;qq=0;break;}//如果出现了非法指令,例如Q,输出结果错误
}
if(qq)//如果指令正确,进行结果输出
{
for(int j=0;j<5;j++)
{
for(int k=kk;k<kk+5;k++)
{
if(k==kk+4){printf("%c",s[j][k]);}//kk同上进行理解,这里表示矩阵每一行的最后一个元素后没有空
else {printf("%c ",s[j][k]);};//这里表示矩阵中每一行除了最后一个元素外,别的元素后面都需要带一个空
}
printf("\n");//矩阵结束后换行
}
}
kk=1;//第一次矩阵输入完成,以后的整体矩阵向右平移一个单位
}
return 0;
}