UVa - 227 - Puzzle

贴两个题目链接,我就不粘题目了,自己去看吧。

https://vjudge.net/problem/UVA-227

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=163

下面是AC代码:

//自己的代码(#^.^#)
#include<stdio.h>
#include<string.h>

int a,b,n=0,k;
char d,x[6][6];

void Move()
{
    k=0;
    while((d=getchar())!='0')
    {
        if(k==0)
        {
            if(d=='A')
            {
                if(a<1)
                {
                    k=1;
                    continue;
                }
                else
                {
                    x[a][b]=x[a-1][b];
                    a=a-1;
                }
            }
            else if(d=='B')
            {
                if(a>3)
                {
                    k=1;
                    continue;
                }
                else
                {
                    x[a][b]=x[a+1][b];
                    a=a+1;
                }
            }
            else if(d=='L')
            {
                if(b<1)
                {
                    k=1;
                    continue;
                }
                else
                {
                    x[a][b]=x[a][b-1];
                    b=b-1;
                }
            }
            else if(d=='R')
            {
                if(b>3)
                {
                    k=1;
                    continue;
                }
                else
                {
                    x[a][b]=x[a][b+1];
                    b=b+1;
                }
            }
        }
    }
    getchar();
}
int main()
{
    while(1)
    {
        //第一部分
        for(int i=0; i<5; i++)
        {
            for(int j=0; j<5; j++)
            {
                x[i][j]=getchar();
                if(x[i][j]=='Z')
                    return 0;
                if(x[i][j]==' ')
                {
                    a=i,b=j;
                }
            }
            getchar();
        }
        //第二部分
        Move();
        //第三部分
        if(n)
            printf("\n");
        printf("Puzzle #%d:\n",++n);
        if(k)
            printf("This puzzle has no final configuration.\n");
        else
        {
            x[a][b]=' ';
            for(int i=0; i<5; i++)
            {
                printf("%c %c %c %c %c\n",x[i][0],x[i][1],x[i][2],x[i][3],x[i][4]);
            }
        }
    }
    return 0;
}
View Code

思路:

        题目可以分成三个部分来看。

        第一,输入原始的5*5网格。存入一个字符串数组,注意换行符的读取。

        第二,空格字符的移动。判断语句注意逻辑关系,只需要把空格要移动过去的那个方格的值赋给现在的空格就可以,不用再把空格赋值到下一个位置,注意最后一个0结束后还会有换行符,并给确定的空格位置赋值。

        第三,输出。相邻两个different puzzle之间要空一行,每行两个相邻的网格中间要空一格。 

参数:

        int a,b,n=0,k;  char d,x[6][6];

       a和b用来记录空格的位置,n用来记录an appropriately labeled number,k用来判断移动过程中网格是否有效,d用来放输入的移动字符,x二维数组用来存放网格数据。

小结:

        仔细理解上下文逻辑,注意数据初始化,这题真的磨光了我的耐心,刚开始怎么都是WA真滴难受。

(#^.^#)

 附一下样例的INPUT测试数据:

TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z

posted @ 2018-05-22 21:31  子诚-  阅读(223)  评论(0编辑  收藏  举报