应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 1256|回复: 1

中南大学几道计算机考研机试题

[复制链接]

68

主题

72

帖子

451

积分

少校

勘查大队长

Rank: 6Rank: 6

积分
451
发表于 2017-4-28 17:45:17 | 显示全部楼层 |阅读模式
哪位老哥大神能告诉我每道题考得什么算法
要是能求解,上代码就更好了。谢谢帮助
题目 B(20 分)
问题描述:
有一个愚蠢的机器人走进了一个 w*h 的迷宫,迷宫里有空地和陷阱。它想要走遍每一个方格,但是它很笨,只会按照指令方向走。当下一步是边界或者是陷阱时,它会向右旋转 90 度。请问这个机器人最多可以经过多少个方格?


数据输入:
对于每组数据,第一行两个数 w 和 h,分别表示迷宫的行和列(1≤w,h≤10)
接下来 w 行,每行有 h 个字符用于描述这个迷宫。迷宫中的‘.’表示空地,即可以走的地方;‘*’表示陷阱,即不能走的地方;迷宫中有一个英文字母,表示机器人的出发点。字母只可能是‘U’、‘D’、‘L’、‘R’,分别表示机器人初始指令方向是向上、向下、向左、向右。

结果输出:
对于每组数据,输出一个整数,表示机器人一共经过了多少个方格

输入示例:
2 3
U..
.*.
4 4
R...
.**.
.**.
....

输出示例:
4
12



题目 C(15 分)
问题描述:
在一片 n*m 的土地上,每一块 1*1 的区域里都有一定数量的金子。这一天,你来到这里淘金。然而当地人告诉你,如果你要挖(x,y)区域的金子,那么你就不能挖(x-1,y)、(x+1,y)以及纵坐标为 y-1 和 y+1 的金子(也就是说你挖某一区域的金子,左边、右边、上一行、下一行的金子你都不被允许挖了)。那么问题来了,你最多能淘多少金?


数据输入:
对于每组数据,第一行两个数 n 和 m,分别表示土地的长度和宽度(1≤n,m≤200)
接下来 n 行,每行有 m 个数表示每个区域金子的数量,每个区域金子数量不超过 1000


结果输出:
对于每组数据,输出最多能得到的金子数量

输入示例:
4 6

11 0 7 5 13 9

78 4 81 6 22 4

1 40 9 34 16 10

11 22 0 33 39 6

输出示例:
242



题目 D(20 分)
问题描述:
巨人国的小学生放学了,老师要给小朋友们排队了。可是这个老师有强迫症,一定要让路队上的小朋友按身高从高到矮排序。小朋友们呢也很调皮,一旦老师给他排好了队就不愿意动了。这时候小朋友们一个一个从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置。请问老师最少要给小朋友们排几条路队?

数据输入:
对于每组数据,第一行一个整数 n,表示小朋友的总数(1≤n≤10000)第二行 n 个整数,表示每个小朋友的身高,身高不超过 30000

结果输出:
对于每组数据,输出一个整数,表示最少的路队数

输入示例:
8

389 207 155 300 299 170 158 65

输出示例

2

样例解释:
最少要排两条路队,其中一种方案是:389-207-155-65 和 300-299-170-158



题目 E(15 分)
问题描述:
你收到通知被中南大学录取了,高兴地来到长沙。很快你就来到了麓山南路上,已知你的位置是 N,中南大学的位置是 K。为了去中南大学,你有两种移动方式:走路或者坐公交车。走路:你可以从位置 X 移动到 X+1 或者 X-1 搭公交:你可以从位置 X 移动到 2X;
每次走路和搭公交所需的时间都是一分钟,你现在想尽快到中南大学,所需的时间是多少呢?

数据输入:
对于每组数据,输入一行,分别是 N 和 K(1≤N,K≤100,000)

结果输出:
对于每组数据,输出一个整数,表示所需时间

输入示例:
5 17

输出示例:
4

样例解释:
其中的一种方案是:5-10-9-18-17 所需时间是 4 分钟。
回复

使用道具 举报

11

主题

13

帖子

125

积分

秀才

Rank: 2

积分
125
发表于 2017-4-28 17:46:48 | 显示全部楼层
本想练练手的,结果第一道题就折腾了一下午加小半个晚上。

[mw_shl_code=c,true]#include<stdio.h>
int w,h;
char**arr;
int start_x,start_y;
char start_drt;
struct data
{
    short north;//记录该单元格是否往北走过,下同
    short east;
    short south;
    short west;
};
struct data**d;
void Initialize(int _w,int _h)
{
    int i,j;
    arr=(char**)malloc(sizeof(char*)*_h);
    d=(struct data**)malloc(sizeof(struct data*)*_h);
    for(i=0;i<_h;i++)
    {
        arr=(char*)malloc(sizeof(char)*_w);
        d=(struct data*)malloc(sizeof(struct data)*_w);
    }
    for(i=0;i<_h;i++)
    {
        for(j=0;j<_w;j++)
        {
            arr[j]=getch();
            printf("%c",arr[j]);
            if(arr[j]=='U'||arr[j]=='D'||arr[j]=='L'||arr[j]=='R')
            {
                start_x=j;start_y=i;start_drt=arr[j];
            }
            d[j].north=d[j].east=d[j].south=d[j].west=0;
        }
        printf("\n");
    }
}
void Free(int _h)
{
    int i;
    for(i=0;i<_h;i++)
        free(arr);
    free(arr);
}
int Scan(int y,int x,char drt)
{
    int covered=0;
    int determined=0;
    while(1)
    {
        determined=0;//判断离开当前位置的去向是否确定
        while(!determined)
        {
            switch(drt)
            {
            case 'U':
                if(y==0||arr[y-1][x]=='*')
                    drt='R';
                else
                {
                    if(d[y][x].north) return covered;//返回走过的坐标数
                    else
                    {
                        covered+=(d[y][x].north==0&&
                            d[y][x].east==0&&d[y][x].south==0&&
                            d[y][x].west==0);//足迹累加
                        d[y][x].north=1;y--;
                        determined=1;
                    }
                }
                break;
            case 'R':
                if(x==w-1||arr[y][x+1]=='*')
                    drt='D';
                else
                {
                    if(d[y][x].east) return covered;//返回走过的坐标数
                    else
                    {
                        covered+=(d[y][x].north==0&&
                            d[y][x].east==0&&d[y][x].south==0&&
                            d[y][x].west==0);
                        d[y][x].east=1;x++;
                        determined=1;
                    }
                }
                break;
            case 'D':
                if(y==h-1||arr[y+1][x]=='*')
                    drt='L';
                else
                {
                    if(d[y][x].south) return covered;//返回走过的坐标数
                    else
                    {
                        covered+=(d[y][x].north==0&&
                            d[y][x].east==0&&d[y][x].south==0&&
                            d[y][x].west==0);
                        d[y][x].south=1;y++;
                        determined=1;
                    }
                }
                break;
            case 'L':
                if(x==0||arr[y][x-1]=='*')
                    drt='U';
                else
                {
                    if(d[y][x].west) return covered;//返回走过的坐标数
                    else
                    {
                        covered+=(d[y][x].north==0&&
                            d[y][x].east==0&&d[y][x].south==0&&
                            d[y][x].west==0);
                        d[y][x].west=1;x--;
                        determined=1;
                    }
                }
                break;
            }
        }
    }
}
int main()
{
    int answer;
    printf("请输入行数,列数(空格隔开):");
    scanf("%d %d",&h,&w);
    Initialize(w,h);
    answer=Scan(start_y,start_x,start_drt);
    printf("走过的位置数:%d\n",answer);
    Free(h);
    return 0;
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-4-28 03:39 , Processed in 0.562485 second(s), 35 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表