【UVa】[227]Puzzle

这里写图片描述

第一印象就是题目好长啊……
据说是ACM/ICPC World Finals 1993的一道题……
感觉屌屌的~

所以……
先把前几天写的对这一题的思路全部打上为敬……

用二维字符串数组储存网格(第n行整体为一字符串)
用字符串记录指令语句,用循环来进行判断
读取到A、B、L、R执行对应命令
其它字符 break; 并输出“This puzzle has no final configuration.”
输入可用两重循环并使用 x,y 来记录空格所在
(网格中空格处记录为 0)
(第二重循环结束用getchar()吸收空行)
A:上 B:下 L:左 R:右 (A:把上方的字母移入空格)
示例代码:

// ARRBBL 其对应变化为
// A:
map(x,y)=map(x,y-1);
map(x,y-1)=0;
y=y-1;
// B:
map(x,y)=map(x,y+1);
map(x,y+1)=0;
y=y+1;
// L:
map(x,y)=map(x-1,y);
map(x-1,y)=0;
x=x-1;
// R:
map(x,y)=map(x+1,y);
map(x+1,y)=0;
x=x+1;

变换后输出结果 (应该可以用一重循环搭配 printf)
printf("%s\n",map[y]);
/* 需要测试 */最直接的还是用两重循环搭配putchar()
(第二重循环结束输出”\n”)

当时就是这样想的
然后今天来正式的写~

首先做二维数组相关的测试
事实证明

char map[5][5];
for(int i=0; i<5; i++)
    scanf("%s",map[i]);

此种写法会把字符存在
map[0][1-5] 这里面
同理可用于 printf
不可以这么打印啊……
具体见:【看书】二维字符数组

所以输入网格的时候不一定要用getchar()
但这里因为涉及到网格中空格的判定
所以还是用 两重循环搭配 getchar() 比较好

久经尝试
虽然改了各种坑点还是WA了……
是在下小看这一题了
先打个flag

WA代码:

#include<stdio.h>
#include<string.h>
int main() {
    int x,y;
    int k,kase=0;
    char s[1000];
    char map[5][5];
    while(scanf("%c",&map[0][0]),map[0][0]!='Z') {
        for(int i=0; i<5; i++) {
            int flag=1;
            for(int j=0; j<5; j++) {
                if(i||j) {
                    map[i][j]=getchar();
                    if(map[i][j]==' ') {
                        y=i;
                        x=j;
                    } else if(map[i][j]=='\n') {
                        map[i][j]=' ';
                        y=i;
                        x=j;
                        flag=0;
                    }
                } else
                    continue;
            }
            if(flag)
                getchar();
        }
        int t=-1;
        memset(s,0,sizeof(s));
        while((s[++t]=getchar())!='0');
        if(kase)
            printf("\n");
        printf("Puzzle #%d:\n",++kase);
        for(k=0; k<t; k++) {
            if(s[k]=='A') {
                if(y-1<0) {
                    printf("This puzzle has no final configuration.\n");
                    break;
                } else {
                    map[y][x]=map[y-1][x];
                    map[y-1][x]=0;
                    y=y-1;
                }
            } else if(s[k]=='B') {
                if(y+1>=5) {
                    printf("This puzzle has no final configuration.\n");
                    break;
                } else {
                    map[y][x]=map[y+1][x];
                    map[y+1][x]=0;
                    y=y+1;
                }
            } else if(s[k]=='L') {
                if(x-1<0) {
                    printf("This puzzle has no final configuration.\n");
                    break;
                } else {
                    map[y][x]=map[y][x-1];
                    map[y][x-1]=0;
                    x=x-1;
                }
            } else if(s[k]=='R') {
                if(x+1>=5) {
                    printf("This puzzle has no final configuration.\n");
                    break;
                } else {
                    map[y][x]=map[y][x+1];
                    map[y][x+1]=0;
                    x=x+1;
                }
            } else if(s[k]=='\n') {
                continue;
            } else {
                printf("This puzzle has no final configuration.\n");
                break;
            }
        }
        if(k==t) {
            for(int i=0; i<5; i++) {
                for(int j=0; j<5; j++) {
                    putchar(map[i][j]);
                    if(j!=4)
                        putchar(' ');
                }
                printf("\n");
            }
        }
        memset(map,0,sizeof(map));
        char ch;
        while((ch = getchar()) != '\n' && ch != EOF);
    }
    return 0;
}

题目地址:【UVa】[227]Puzzle

原文地址:https://www.cnblogs.com/BoilTask/p/12569924.html