Puzzle(自认为是模拟)

题目(截图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

这个题的难点有两个,一个是输入(不能用gets()),另一个是模拟移动空格的位置,搞定了这两点,AC就很easy啦。

代码+注释

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
int main()
{
    char a,b;
    int num=0;
    int flag=1;
    char arr[10][10];              //储存输入的五行字符串。
    while(1)                   //死循环,若输入Z,则主观终止循环。
    {
        scanf("%c",&arr[0][0]);
        if(arr[0][0]=='Z')               //判断是否需要终止循环。
            break;
        for(int i=1; i<=4; i++)             //输入第一行上下的字符串。
            {
            scanf("%c",&arr[0][i]);
            }
        getchar();              //吸收换行符(很重要!!!!)。
        for(int i=1;i<=4;i++)                  //输入剩下的四行字符串。
        {
            for(int j=0;j<5;j++)
            {
                scanf("%c",&arr[i][j]);
            }
            getchar();
        }
        int x1=0,y1=0,x2=0,y2=0;
        for(int i=0; i<5; i++)              //两重循环寻找空格位置(坐标表示)。
        {
            for(int j=0; j<5; j++)
            {
                if(arr[i][j]==' ')
                {
                    x1=i;
                    y1=j;
                    break;
                }
            }
        }
        flag=1;
        while(cin>>a)        //输入控制空格移动的字符 。
        {
            x2=x1;             //每输入一次都要重置x2,y2。
            y2=y1;             //这两行很关键!!!!!非常关键!!!!!!!
            if(a=='0')break;         //输入完毕则停止循环。
            else if(a=='A')          //分情况讨论,模拟空格位置的变化。
            {
                x2=x1-1;
                y2=y1;
            }
            else if(a=='B')
            {
                x2=x1+1;
                y2=y1;
            }
            else if(a=='R')
            {
                x2=x1;
                y2=y1+1;
            }
            else if(a=='L')
            {
                x2=x1;
                y2=y1-1;
            }
            if(x2<0||x2>4||y2<0||y2>4)          //若发生非法移动,则flag=0。
            {
                flag=0;
                while(1)                   //注意!!!一定要输入完剩下的控制空格移动的字符!!!!
                {
                    cin>>a;
                    if(a=='0')
                        break;
                }
                break;
            }
            else             //模拟交换位置。
            {
                arr[x1][y1]=arr[x2][y2];
                arr[x2][y2]=' ';
                x1=x2;
                y1=y2;
            }
        }
        getchar();
        if(num!=0)          //判断换行的条件。
        {
            cout<<endl;
        }
        num++;
        cout<<"Puzzle #"<<num<<":"<<endl;                //输出样例的次序。
        if(flag==0)
            cout<<"This puzzle has no final configuration."<<endl;
        else
        {
            for(int i=0; i<5; i++)
            {
                for(int j=0; j<5; j++)
                {
                    cout<<arr[i][j];
                    if(j!=4)
                        cout<<" ";
                }
                cout<<endl;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/88082341