《算法竞赛入门经典(第2版)》习题3-5谜题(Puzzle, UVa227)

习题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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值