zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Page Cache(页面缓存)
    使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Intercepting Filter(截取筛选器)
    使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍
    使用Micrisoft.net设计方案 第三章Web表示模式
    使用Micrisoft.net设计方案 第二章组织模式
    使用Micrisoft.net设计方案 第一章 企业解决方案中构建设计模式
    Area区域路由的配置
    Area路由的配置
    layUI+mvc动态菜单数据表
    layUI+mvc动态菜单控制器
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569924.html
Copyright © 2011-2022 走看看