中南大学考研几道机试题

几道中南大学考研机试题
哪位老哥大神能告诉我每道题考得什么算法
要是能求解,上代码就更好了。谢谢帮助
题目 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 分钟。

分别是前三道分别是广搜、深搜、动态规划,最后一道题目用深搜也可以做,也可以用动态规划做,恩,大概是这样子的

B题有死循环应该要特判

不问了,全AC了

B、C、D、E AC代码如下

#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct status {
  int i;
  int j;
  char direction;
  int moves;
  int turned;  // turned without move, if move reset this state to 0
};

bool notValid(char c) {
  return c == '*' || c == 'x';
}

char turn(char c) {
  string s = "RDLUR";
  return s[s.find(c)+1];
}

bool move(vector<vector<char>> &v, status* s, int M, int N) {
  char direction = s->direction;
  bool success = true;
  int curi = s->i, curj = s->j;
  // cout << curi << " " << curj << " " << direction << " !!!" << endl;
  switch(direction) {
    case('U'):
      if(curi-1 < 0 || notValid(v[curi-1][curj])) {
        if(s->turned > 3) {
          return false;
        }
        else {
          s->direction = turn(direction);
          s->turned++;
        }
      }
      else {
        s->i = curi - 1;
        s->moves++;
        s->turned = 0;
        v[curi][curj] = 'x';  // no turning back
      }
      break;
    case('R'):
      if(curj+1 >= N || notValid(v[curi][curj+1])) {
        if(s->turned > 3) {
          return false;
        }
        else {
          s->direction = turn(direction);
          s->turned++;
        }
      }
      else {
        s->j = curj + 1;
        s->moves++;
        s->turned = 0;
        v[curi][curj] = 'x';
      }
      break;
    case('D'):
      if(curi+1 >= M || notValid(v[curi+1][curj])) {
        if(s->turned > 3) {
          return false;
        }
        else {
          s->direction = turn(direction);
          s->turned++;
        }
      }
      else {
        s->i = curi + 1;
        s->moves++;
        s->turned = 0;
        v[curi][curj] = 'x';
      }
      break;
    case('L'):
      if(curj-1 < 0 || notValid(v[curi][curj-1])) {
        if(s->turned > 3) {
          return false;
        }
        else {
          s->direction = turn(direction);
          s->turned++;
        }
      }
      else {
        s->j = curj - 1;
        s->moves++;
        s->turned = 0;
        v[curi][curj] = 'x';
      }
      break;
  }
  return success;
}

int main() {
  string directions = "UDLR";
  int M, N, startx, starty;
  char direction;
  vector<vector<char>> v;
  char c;
  while(cin >> M >> N) {
    v.clear();
    v.reserve(M);
    for(int i=0; i<M; i++) {
      v.push_back(vector<char>());
      v[i].reserve(N);
      for(int j=0; j<N; j++) {
        cin >> c;
        v[i].push_back(c);
        if(directions.find(v[i][j]) != string::npos) {
          startx = i;
          starty = j;
          direction = v[i][j];
        }
      }
    }

    status* s = new status{startx, starty, direction, 1, 0};
    bool able = true;  // still movin, help me get up
    do {
      able = move(v, s, M, N);
    } while(able);
    cout << s->moves << endl;
  }

  return 0;
}


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  vector<int> v;
  int n, x;

  while(cin >> n) {
    v.clear();
    for(int i=0; i<n; i++) {
      cin >> x;
      bool flag = false;

      for(int i=0; i<v.size(); i++) {
        if(x <= v[i]) {
          v[i] = x;
          flag = true;
          break;
        }
      }
      if(!flag) {
        v.push_back(x);
      }
      sort(v.begin(), v.end());
    }
    cout << v.size() << endl;
  }

  return 0;
}

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <map>

using namespace std;


int main() {
  int n, m;
  double val;
  vector<vector<int>> v;

  while(cin >> n >> m) {
    v.clear();
    v.reserve(n);

    for(int i=0; i<n; i++) {
      v.push_back(vector<int>());
      v[i].reserve(m);

      for(int j=0; j<m; j++) {
        cin >> val;
        v[i].push_back(val);
      }
    }

    vector<int> opt, lineSum, optLines;
    for(auto line : v) {
      opt.clear();
      if(line.size() > 0) {
        opt.push_back(line[0]);
      }
      if(line.size() > 1) {
        opt.push_back(max(line[0], line[1]));
      }
      for(int i=2; i< line.size(); i++) {
        opt.push_back(max(opt[i-1], opt[i-2]+line[i]));

      }
      lineSum.push_back(opt.back());
    }

    if(v.size() > 0) {
      optLines.push_back(lineSum[0]);
    }
    if(v.size() > 1) {
      optLines.push_back(max(lineSum[0], lineSum[1]));
    }
    for(int i=2; i<lineSum.size(); i++) {
      optLines.push_back(max(optLines[i-1],lineSum[i]+optLines[i-2]));
    }
    cout << optLines.back() << endl;

    lineSum.clear();
    optLines.clear();
  }
  return 0;
}
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#include <string>
#include <set>
#include <queue>
#define LARGE 200001

using namespace std;


int arr[LARGE];

int main() {
  int n, k;
  while(cin >> n >> k) {
    arr[n] = 0;
    set<int> s;
    s.emplace(n);
    queue<int> q;
    q.push(n);
    while(!q.empty()) {
      n = q.front();
      if(n==k) {
        cout << arr[k] << endl;
        break;
      }
      q.pop();
      if(n<k+1) {
        if(s.emplace(n*2).second) {
          arr[n*2] = arr[n] + 1;
          q.push(n*2);
        }
      }
      if(s.emplace(n+1).second) {
        arr[n+1] = arr[n] + 1;
        q.push(n+1);
      }

      if(n>0) {
        if(s.emplace(n-1).second) {
          arr[n-1] = arr[n] + 1;
          q.push(n-1);
        }
      }
    }
    q = queue<int>();
    s.clear();
  }
  return 0;
}