算法竞赛入门经典第二版课后习题 3-5 谜题

算法竞赛入门经典第二版课后习题 3-5 谜题

自己写了写代码,功能实现了但是有点小瑕疵,如果输入了非法指令,这段程序会不执行打印错误信息并且不执行非法指令之后的部分,但是非法指令之前的正确指令依然会被执行,这个有点不符合题意了。

小菜鸟一个,效率什么的就先不考虑啦~
还没有上网看别人写的代码,向大佬学习完再来补充~
emmm100多行,感觉自己好菜鸡


上网看了看别人写的代码,生成空格的方式跟我不太一样,我还是更喜欢我自己的嘿嘿,
不过还是有了点启发,做了一些改进,一个是空格在边缘移动时如果在最右端会移动到最左端,其他情况以此类推,这样的话代码就更多啦,好无奈
希望自己能不断进步,以后再回来把它改的好一点吧

# include <iostream>
# include <cstdlib>
# include <ctime>
# include <cstring>
# include <iomanip>
using namespace std;
const int MAX = 100;
int main()
{
    char Map[5][5];
    memset(Map,'\0',sizeof(Map));
    //26个英文字母
    char En[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    //随机产生空格子的坐标(x,y)
    srand(time(0));
    int x = rand()%5;
    int y = rand()%5;

    //生成初始方格
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 5; j++)
        {
            if(i == x && j ==y)
                continue;
            else
            {
                int m = rand()%26;
                while(En[m] == '\0')
                {
                    m = rand()%26;
                }
                Map[i][j] = En[m];
                En[m] = '\0';
            }
        }
    }
    //打印初始方格
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 5; j++)
            cout<<setw(3)<<Map[i][j];
        cout<<endl;
    }

    //录入命令
    cout<<"输入A、B、L、R使空格上下左右移动,以0为结束符: ";
    char s[MAX];
    memset(s,'0',sizeof(s));
    char n;
    for(int i = 0; i < MAX; i++)
    {
        cin>>n;
        if(n == '0')
            break;
        else
            s[i] = n;
    }

    bool isright = true;
    char t;
    for(int i = 0; i < MAX; i++)
    {
        if(s[i] != '0')
        {
            switch(s[i])
            {
            case 'A':
                //up();
                if(x!=0)
                {
                    t = Map[x-1][y];
                    Map[x-1][y] = '\0';
                    Map[x][y] = t;
                    x--;
                }
                else
                {
                    t = Map[4][y];
                    Map[4][y] = '\0';
                    Map[x][y] = t;
                    x = 4;
                }
                break;
            case 'B':
                //down();
                if(x!=4)
                {
                    t = Map[x+1][y];
                    Map[x+1][y] = '\0';
                    Map[x][y] = t;
                    x++;
                }
                else
                {
                    t = Map[0][y];
                    Map[0][y] = '\0';
                    Map[x][y] = t;
                    x = 0;
                }
                break;
            case 'L':
                //left();
                if(y!=0)
                {
                    t = Map[x][y-1];
                    Map[x][y-1] = '\0';
                    Map[x][y] = t;
                    y--;
                }
                else
                {
                    t = Map[x][4];
                    Map[x][4] = '\0';
                    Map[x][y] = t;
                    y = 4;
                }
                break;
            case 'R':
                //right();
                if(y!=4)
                {
                    t = Map[x][y+1];
                    Map[x][y+1] = '\0';
                    Map[x][y] = t;
                    y++;
                }
                else
                {
                    t = Map[x][0];
                    Map[x][0] = '\0';
                    Map[x][y] = t;
                    y = 0;
                }
                break;
            default:
                cout<<"This puzzle has no final configuration.\n";
                isright = false;
                break;
            }
        }
        if(isright == false)
            break;
    }

    //打印命令执行之后的方格
    if(isright == true)
    {
        for(int i = 0; i < 5; i++)
        {
            for(int j = 0; j < 5; j++)
                cout<<setw(3)<<Map[i][j];
            cout<<endl;
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值