习题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

智能推荐

java.lang.OutOfMemoryError: GC overhead limit exceeded问题解决_peachpi的博客-程序员宝宝

最近网站经常出现java.lang.OutOfMemoryError: GC overhead limit exceeded问题。 jvm分析相关工具:jmap命令详解http://blog.csdn.net/zhaozheng7758/article/details/8623530 jstat详解:http://blog.163.com/yangshuo_qq/blo

VOT最新进展_KirioYoLo的博客-程序员宝宝

VOT2015竞赛 VOT2015 Challenge | Home(http://votchallenge.net/vot2015/) 如期而至,这一年有60个精挑细选的序列,62个tracker,最大看点是深度学习开始进击tracking,MDNet直接拿下当年的冠军,而结合深度特征的相关滤波方法DeepSRDCF是第二名,主要解决边界效应的SRDCF仅HOG特征排在第四:计算机视觉中,究竟有哪

openshift client 命令 之 groups_weixin_34049948的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

python摄像头识别条形码、二维码并打印信息_cwqHHH的博客-程序员宝宝_图像识别条形码并输出信息

提前安装好pyzbar 和 opencv-python库//安装方法:打开cmd, 输入 pip install ...(pyzbar / opencv-python)注意!!!打开摄像头的瞬间,不要被自己的大脸吓到哈哈哈哈哈哈哈哈哈#首先导入本次所需要的库,最后一个csv是Python自带的csv表格操作库,这里我们需要把我们扫到的二维码信息都存入csv表格里。import ...

测试理论整理1_chuzixuan的博客-程序员宝宝

1.B/S架构和C/S架构区别B/S架构需要重点考虑系统在不同的浏览器中的兼容性问题(浏览器的内核不同)C/S 架构需要考虑系统在不同平台的安装、卸载、升级2.HTTP协议超文本传输协议,应用层协议,由请求与响应组成。常见的请求方式有POST/GET,常见的状态码200ok,301永久移动,302临时移动,404找不到资源,500服务器内部错误。3.POST与GET区别get请求常用在获取数据,post常用于发送数据get请求速度比post稍快get请求的数据是跟随请求地址一起发送,而po

VBA学习收集_linuxlive的博客-程序员宝宝

本示例为设置密码窗口 (1) If Application.InputBox("请输入密码:") = 1234 Then [A1] = 1 密码正确时执行 Else: MsgBox "密码错误,即将退出!" 此行与第2行共同设置密码 End If 本示例为设置密码窗口 (1) X = MsgBox("是否真的要结帐?", vbYesNo) If X = vbYes Then Close 本示例

随便推点

Hadoop学习之SecondaryNameNode、NameNode恢复_CYZ412的博客-程序员宝宝

摘自:http://5276605.blog.51cto.com/5266605/1423288摘自:http://www.cnblogs.com/ggjucheng/archive/2012/04/18/2454693.html 在启动Hadoop时,NameNode节点上会默认启动一个SecondaryNameNode进程,使用JSP命令可以查看到。SecondaryNameN...

完成端口编程模型介绍_peter333666的博客-程序员宝宝_端口模型设计流程图

到了公司作VNETOO运行平台服务器的开发,看了一下同行的代码,才感觉以前对完成端口掌握还不到火候。今天我们来谈一谈Win32下的完成端口模型的编程设计。1。恒珈科技的网上阅卷系统分析-----------------------------        以前用完成端口主要是使用从网络上下载的一个类:CompletionPortModel,应该说这个类封装得很好,也很好使用。但当时对完成端口

Wamp下载及安装问题_S+F的博客-程序员宝宝_wamp chosen

WampServer下载:安装软件尽量选择去官网,而不是去第三方网站下载,因为你在第三方网站下载的软件可能是被做过恶意修改的。wamp我去了官网下载,不过这个网站可真是够颠覆认知的。下载按钮不能用来下载,不要怀疑你的浏览器和鼠标,都没有坏,是这个按钮链接的问题!辛辛苦苦找到了下载的地方下载的是一个40MB左右的更新包???!!!安装的时候才发现,报的错误信息如下:the install..._1671465600

java中的volatile关键字日常用法实践_lucky_tom的博客-程序员宝宝

文章目录前言一、volatile关键字的语义?二、举例实践1.可见性2.DCL单例模式中禁止指令重排序总结前言本篇文章主要记录在读完《深入理解Java虚拟机》中对volatile关键字的用法后,进行个人消化后的总结和代码实践。一、volatile关键字的语义?可见性,子线程修改变量,值立即回写到主内存,其他线程不从缓存而是直接从主内存读取新值。禁止指令优化重排序。二、举例实践1.可见性代码如下(示例):public class Demo { private static

1+X Web前端等级考证 | PHP 技术与应用(中级重点)_Ly_cat的博客-程序员宝宝

动态网站概念误区:不是指网站当中包含动态图片、滚动图等动态效果正解:采用数据库技术开发的网站,网页上的内容都是通过数据库提取出来动态更新的B/S 软件通过浏览器和服务器(Browser / Server)进行通信的软件,客户端给服务器发请求,服务器处理客户请求返回结果优势:不用下载,不用更新,打开网页,直接使用劣势:功能受限(受浏览器环境限制)使用技术前端:html+css+javascript后端:php、asp、java数据库:MySQL、SQLServer、ORA

关于Unity3D接入SDK之后,游戏中的文字输入框无法输入内容的问题_河乐不为的博客-程序员宝宝_unity输入框无法输入

关于Unity3D接入SDK之后,游戏中的文字输入框无法输入内容的问题假如要向游戏中接入SDK,我们通常有两种做法:将游戏项目从U3D中导出eclipse工程,然后用eclipse打开,具体的接入工作与向普通的android应用中接入无异,完成SDK接入工作之后,直接用eclipse进行项目打包;在eclipse中新建一个android项目,包名与游戏项目名称保持一致,将U3D引擎