习题3-5 UVa 227 Puzzle_SeasonJoe的博客-程序员宝宝

技术标签: uva  

要点:
1.scanf(” %c”,&c),(注意前面的空格)可以跳过换行符等
第一次照网上的代码打的如下,虽然简化了代码,要注意行和列

#include<stdio.h>
#include<string.h>
char map[5][5];
const int y[] = { 0,0,1,-1 };
const int x[] = { -1,1,0,0 };
int tra[110];  //移动行所在的数组

bool legal(int pos)
{
    return 0 <= pos&&pos < 5;   //判断是否越界
}

void pmap()
{
    for (int row = 0; row < 5; row++)
    {
        printf("%c", map[row][0]);
        for (int col = 1; col < 5; col++)
            printf(" %c", map[row][col]);  //分开输出,确保每个间隔一个空格
        printf("\n");
    }
}

int main()
{
    tra['A'] = 0;
    tra['B'] = 1;
    tra['R'] = 2;
    tra['L'] = 3;
    bool first = true;  //使第一个矩阵不空行,从第二个矩阵开始空行
    int n = 1;
    int bx, by;
    while (gets(map[0]))    //先输入第一行判断是否为Z 
    {                         //gets不符合C11标准
        if (map[0][0] == 'Z')
            break;
        for (int row = 1; row < 5; row++)
            gets(map[row]);
        for (int i = 0; i < 5; i++)
            for (int j = 0; j < 5; j++)
                if (map[i][j] == ' ')
                {
                    bx = i;    //x对应的是列,y对应行
                    by = j;
                }
        bool ok = true;
        char c;
        while (scanf(" %c", &c), c != '0')  //%c前空一格可跳过换行符,使移动行可以多行输入
        {
            if (!ok)
                continue;
            int nx = bx + x[tra[c]], ny = by + y[tra[c]];
            if (!legal(nx)||!legal(ny))
            {
                ok = false;
                continue;
            }
            map[bx][by] = map[nx][ny];
            map[nx][ny] = ' ';
            bx = nx; by = ny;
        }
        getchar();   //最后用getchar吃掉一个换行符
        if (first)
            first = false;
        else
            printf("\n");
        printf("Puzzle #%d:\n", n++);
        if (ok)
            pmap();
        else
            printf("This puzzle has no final configuration.\n");
    }
    return 0;
}

第二次尝试用简单的办法,自己敲得的代码如下,虽然麻烦但好在行列变换易于理解

#include<stdio.h>
char map[5][5];
int bx,by,nx,ny;

bool legal(int pos)
{
    return 0<=pos&&pos<5;
}

void pmap()
{
    for(int row=0;row<5;row++)
    {
        printf("%c",map[row][0]);
        for(int col=1;col<5;col++)
            printf(" %c",map[row][col]);
        printf("\n");
    }
}

void swap(int bx,int by,int nx,int ny)
{
   map[bx][by]=map[nx][ny];
   map[nx][ny]=' ';
}//bx,by不能在函数中赋值,要用指针

int main()
{
    bool first=true;
    int n=1;
    while(gets(map[0]))
    {
        if(map[0][0]=='Z')
            break;
        for(int row=1;row<5;row++)
            gets(map[row]);
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
            if(map[i][j]==' ')
            {
                bx=i;
                by=j;
            }
        bool ok=true;
        char c;
        while(scanf(" %c",&c),c!='0')
        {
            if(!ok)
                continue;
            if(c=='A')
            { 
               nx=bx-1;ny=by;
               if(!legal(nx)||!legal(ny))
               {
                   ok=false;
                   continue;
               }
               swap(bx,by,nx,ny);
               bx=nx;by=ny;
            }
            if(c=='B')
            { 
               nx=bx+1;ny=by;
                if(!legal(nx)||!legal(ny))
               {
                   ok=false;
                   continue;
               }
               swap(bx,by,nx,ny);
               bx=nx;by=ny;
            }
            if(c=='L')
            { 
               nx=bx;ny=by-1;
               if(!legal(nx)||!legal(ny))
               {
                   ok=false;
                   continue;
               }
               swap(bx,by,nx,ny);
               bx=nx;by=ny;
            }
            if(c=='R')
            { 
               nx=bx;ny=by+1;
               if(!legal(nx)||!legal(ny))
               {
                   ok=false;
                   continue;
               }
               swap(bx,by,nx,ny);
               bx=nx;by=ny;
            }       
        }
      getchar();
      if(first)
         first=false;
      else
         printf("\n");
      printf("Puzzle #%d:\n", n++);
      if (ok)
            pmap();
        else
            printf("This puzzle has no final configuration.\n");
    }
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SeasonJoe/article/details/49785793

智能推荐

解决mybatis generator无法覆盖XML_茅坤宝骏氹的博客-程序员宝宝_如何覆盖jar中的mapper.xml

转载自解决mybatis generator无法覆盖XML今天发现mybatis generator maven plugin在重复生成的时候xml文件只会merge,不会覆盖。明明在pom.xml中配置了如下:&lt;configuration&gt; &lt;configurationFile&gt;src/main/resources/mybatis/generat...

centos7全分布模式安装hadoop--hadoop安装系列之二_新兴ICT项目支撑的博客-程序员宝宝_blockmanagement.blockmanager: encryptdatatransfer=

一、实验目标     1、学会全分布集群模式安装hadoop软件     2、学会安装hadoop软件过程中的各种跳坑姿势二、实验环境    三台机器的网络主机配置如下:192.168.10.166 master192.168.10.167 slave01192.168.10.168 slave02再次梳理一下安装前置条件:  1、安装三台centos7的服

Python学习第三篇——访问列表部分元素_weixin_30678349的博客-程序员宝宝

1 dongman =["huoying","sishen","si wang bi ji","pan ni de lu lu xiu"];2 print(dongman[0:2])3 print(dongman[1:4])4 print(dongman[:3])#from the first one5 print(dongman[2:])# from third number...

LVS学习笔记 3LVS-DR实验 初步试验_sweifan的博客-程序员宝宝_lvs-dr虚拟服务实验总结

1、理解:由于DR模型director只负责分发请求,而不连入外网,外网由前段路由接入,所以前段路由、director和realserver都通过交换机链接,所以在集群内部通过MAC地址进行通信。由于Direstor双IP:VIP|别名DIP,RS双IP:RIP|别名VIP,因此在ARP广播时要限制网卡ARP响应功能,比如路由器要把保温送到VIP,做ARP广播时,只能是Director回应,而

MCP3424的使用说明_挫爆了的大M的博客-程序员宝宝_mcp3424

最近由于项目需要使用到了MCP3424,这款芯片,概述如下:        MCP3422、 MCP3423 和 MCP3424 器件( MCP3422/3/4)为 Microchip MCP342X 系列的低噪声和高精度 18 位  A/D( delta-sigma analog-to-digital)转换器。这些器件可将模拟输入信号转换成分辨率高达18 位的数字代码。片内 2.048V ...

java判断是平年还是闰年_爱写Bug的小孙的博客-程序员宝宝_java平年闰年的判断

平年,闰年的写法中国有两种年,一个是平年一个是闰年,但是要是用java写出也不难吧!下面开看代码!!算了先看看思路吧要求:Java实现判断闰年平年,并输出某月天数思路:闰年的判断条件是:能被4整除但不被100整除能被400整除然后判断天数,天数31天,30天都会吧我们要知道,闰年2月有29天平年2月有28天。好了我们来写代码import java.util.Scanner;public class Practice3 { public static void main(

随便推点

PTA习题8-10 输出学生成绩_忑忠忐的博客-程序员宝宝_输出学生成绩pta

习题8-10 输出学生成绩(20 分)本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。输入格式:输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。输出格式:按照以下格式输出:average = 平均成绩max = 最高成绩min = 最低成绩结果均保留两位小数。输入样例...

第一天计算机谁发明的,世界公认三大天才,尼古拉特斯拉是当之无愧的第一天才..._诗语情柔的博客-程序员宝宝

在历史的长河中,出现过许许多多惊才绝艳的人,他们都有着不同寻常的经历和成就。尼古拉特斯拉、达芬奇、爱因斯坦这个位是世界公认三大天才,他们都有着超越寻常人的成就。他们的智商根本就不是普通人能比得上的,下面为大家简单介绍一下他们的成就。一、尼古拉特斯拉尼古拉特斯拉作为一个高智商的科学家,他一生有过许许多多的发明。特别是他主持设计了现代交流电系统,为电力的发展做出了巨大的贡献,他在电磁场领域有着多项革命...

排座椅_NWPU-SOC的博客-程序员宝宝

题目: 排座椅上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 DD 对同学上课时会交头接耳。同学们在教室中坐成了 M 行 N 列,坐在第 ii 行第 j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,LL 条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交

JQuery Mobile 学习笔记2-4:changePage()方法跳转页面_请訆涐尐坤的博客-程序员宝宝

Murphy_JQueryMobile的changePage()方法跳转页面$(function(){    $.mobile.changePage('about.html',{        transition:'slideup'    });});跳转页面

推荐文章

热门文章

相关标签