UVa 227 Puzzle(谜题)

来源:互联网 发布:40岁学编程 没公司要 编辑:程序博客网 时间:2024/04/30 01:06

UVa 227 Puzzle(谜题)
UVa题目链接
题目名称:谜题
题目描述:
有一个55的网格,其中恰好有一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(分别以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration.",例如,图执行ARRBBL0后,效果如图所示
Alt text
题目分析:
题目需要做的事情
①输入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 <stdio.h>#include <string.h>#define maxn 20#define command 10000char 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;}
0 0