UVa 227 Puzzle(谜题)

UVa 227 Puzzle(谜题)
UVa题目链接
题目名称:谜题
题目描述:
有一个55的网格,其中恰好有一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(分别以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration.",例如,图执行ARRBBL0后,效果如图所示

题目分析:
题目需要做的事情
①输入5
5的字符,每个格子有一个字母,有一个格子是空格
②找出输入字符空格的具体位置,保存下来
③之后分别检测指令A,B,L,R,这里还需要注意边界的地方,
④最后根据指令进行移动,最后从新输出每个格子的每个字符
学习笔记:
①这道题跟以前那道填数字的题目,有区别,因为题目中需要两个输入,格子形状输入用gets(a[i])表示第几行。输出的时候可以采用循环printf("%c %c %c %c %c\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]); 注意这里输入不能用scanf因为有一个是空格。这样就输出我们需要的结果了。
②对于检测指令,第一步是如果是非法指令,但是我们不好描述条件时,输出,这个时候为了和和发指令区分开来,所以我们设置了一个flag,如果非法时,我们设为0这样最后输出的时候,我们就有条件
③检测指令的时候,还需要注意边界问题,记住a[x][y] x代表的是竖直方向,y代表的是水平方向。一定要注意边界问题
④检测到指令的时候,我们首先需要将空格移动到目标位置的值放在空格区域,之后把空格放入目标区域这个与以前填数多一步,因为以前那个目标区域全是0

==============================================================================
参考代码:

//.c
#include 
#include 
#define maxn 20
#define command 10000
char a[maxn][maxn];
char s[command];
int main()
{
    int blank_x = 0, blank_y = 0;
    int flag = 1;
    //先输入值
    /*for(int x=0; x<5; x++)
    {
        for(int y=0; y<5; y++)
        {
            scanf("%c",&a[x][y]);
        }
    }*/

    //************************************
    gets(a[0]);
    gets(a[1]);
    gets(a[2]);
    gets(a[3]);
    gets(a[4]);

    //检测空格的位置
    for(int x=0; x<5; x++)
    {
        for(int y=0; y<5; y++)
        {
            if(a[x][y] == ' ')
            {
                blank_x = x;
                blank_y = y;
            }
        }
    }

    //输入指令
    gets(s);
    int len = strlen(s);

    for(int i = 0; i < len; i++)
    {
        if(s[len-1] == '0' || s[i] == 'A' || s[i] == 'R' || s[i] == 'B' || s[i] == 'L' )
        {
            if(s[i] == 'A' && blank_x != 0)
            {
                a[blank_x][blank_y] = a[blank_x-1][blank_y];
                a[--blank_x][blank_y] = ' ';
            }
            if(s[i] == 'R' && blank_y != 4)
            {
                a[blank_x][blank_y] = a[blank_x][blank_y+1];
                a[blank_x][++blank_y] = ' ';
            }
            if(s[i] == 'B' && blank_x != 4)
            {
                a[blank_x][blank_y] = a[blank_x+1][ blank_y];
                a[++blank_x][ blank_y] = ' ';
            }
            if(s[i] == 'L' && blank_y != 0)
            {
                a[blank_x][blank_y] = a[blank_x][ blank_y-1];
                a[blank_x][--blank_y] = ' ';
            }
        }
        else flag = 0;
    }
    if(flag)
    {
        for(int i = 0; i < 5; i++)
        {
            printf("%c %c %c %c %c\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]);
        }
    }
    else
        printf("This puzzle has no final configuration.\n");

return 0;
}

你可能感兴趣的:(UVa算法研究篇)