• 移动距离——第六届蓝桥杯C语言B组(省赛)第八题


    原创 


    问题描述:

    移动距离

    X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
    当排满一行时,从下一行相邻的楼往反方向排号。
    比如:当小区排号宽度为6时,开始情形如下:

    1 2 3 4 5 6
    12 11 10 9 8 7
    13 14 15 .....

    我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

    输入为3个整数w m n,空格分开,都在1到10000范围内
    w为排号宽度,m,n为待计算的楼号。
    要求输出一个整数,表示m n 两楼间最短移动距离。 

    例如:
    用户输入:
    6 8 2
    则,程序应该输出:
    4

    再例如:
    用户输入:
    4 7 20
    则,程序应该输出:
    5

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

    提交时,注意选择所期望的编译器类型。

    解题思路:

    此题较简单,最短路径很容找,两个数的(行差+列差)就是最短路径了。

    代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 
     5 int main()
     6 {
     7     int w,m,n;
     8     scanf("%d%d%d",&w,&m,&n);
     9     int a=m>n?m:n;    //求出两数中较大者,用于创建数组 
    10     
    11     int row;    //行数 
    12     if(a%w!=0)    //求出数组行数 
    13         row=a/w+1;
    14         else
    15             row=a/w;
    16             
    17     int **arr=(int **)malloc(sizeof(int *)*row);    //创建数组 
    18     int i;
    19     for(i=0;i<=row-1;i++)
    20         arr[i]=(int *)malloc(sizeof(int)*w);
    21         
    22     int j;    
    23     int k=0;
    24     for(i=0;i<=row-1;i++)    //数组赋值 
    25     { 
    26         if(i%2==0)     //偶数行,从左到右赋值 
    27             for(j=0;j<=w-1;j++)
    28                 arr[i][j]=++k;
    29         if(i%2==1)    //奇数行,从右到左赋值 
    30             for(j=w-1;j>=0;j--)
    31                 arr[i][j]=++k;
    32     } 
    33     
    34     int b=m<n?m:n;    //求出较小者 
    35     
    36     int row1;
    37     int row2;    
    38     if(a%w==0)    //求出较大数的行数下标 
    39         row1=a/w-1;
    40         else
    41             row1=a/w;
    42     if(b%w==0)    //求出较小数的行数下标 
    43         row2=b/w-1;    //减1是因为行数从0开始 
    44         else
    45             row2=b/w;
    46     int buk;
    47     buk=row1-row2;    //行差 
    48     int rank1;
    49     int rank2;
    50     for(j=0;j<=w-1;j++)
    51         if(arr[row1][j]==a)
    52         {
    53             rank1=j;    //求出较大数的列数下标 
    54             break;
    55         }
    56     for(j=0;j<=w-1;j++)
    57         if(arr[row2][j]==b)
    58         {
    59             rank2=j;    //求出较小数的列数下标 
    60             break;
    61         }
    62     buk=buk+rank1-rank2;    //行差+列差 
    63     printf("%d",buk);
    64     return 0;
    65 } 

    2018-03-19

    作者:剑冢、
    本文为原创博客,转载请声明出处地址。
  • 相关阅读:
    sgu101Domino
    KM模版
    UVA11383 Golden Tiger Claw(KM算法)
    POJ3565Ants(KM算法)
    POJ3041Asteroids(二分图最小点覆盖)
    UVA1175 Ladies' Choice(稳定婚姻问题,二分图)
    POJ1273Drainage Ditches(裸的最大流)
    UVA1201 Taxi Cab Scheme(POJ2060)DAG的最小路径覆盖
    二分图最大匹配数模版
    11419 SAM I AM(二分图)
  • 原文地址:https://www.cnblogs.com/chiweiming/p/8601328.html
Copyright © 2020-2023  润新知