2019中南大学研究生招生夏令营机试题

132 阅读2分钟

传送门

1110: 地砖问题---dfs

小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色的地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。

请你编程计算小明可以走到的黑色地砖最多有多少块。

  • dfs遍历图即可
#include <bits/stdc++.h>

using namespace std;

char g[30][30];
int st[30][30];
int n, m;

int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
int cnt;
void dfs(int x, int y) {
  st[x][y] = 1;
  for (int i = 0; i < 4; i++) {
    int xx = x + dx[i], yy = y + dy[i];

    if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && !st[xx][yy] &&
        g[xx][yy] != '#') {
      cnt++;
      dfs(xx, yy);
    }
  }

  // st[x][y] = 0;
}

int main() {
  while (cin >> m >> n) {
    memset(st, 0, sizeof st);
    cnt = 1;
    if (n == 0 && m == 0) break;
    int x, y;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        cin >> g[i][j];
        if (g[i][j] == '@') {
          x = i, y = j;
        }
      }
    }
    dfs(x, y);
    cout << cnt << endl;
  }

  return 0;
}

1113: 有序合并---归并排序

已知线性表LA和LB中的数据元素按值非递减有序排列,现要求LA和LB归并为一个新的线性表LC,且LC中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11),LB=(2,6,8,9,11,15,20)则LC=(2,3,6,6,8,8,9,11,11,15,20)。

  • 归并排序
#include <bits/stdc++.h>

using namespace std;

int la[110], lb[110], lc[220];
int m, n;

int main() {
  while (cin >> m) {
    for (int i = 1; i <= m; i++) {
      cin >> la[i];
    }

    cin >> n;
    for (int i = 1; i <= n; i++) {
      cin >> lb[i];
    }

    // 归并排序
    int l = 1, i = 1, j = 1;

    while (i <= m && j <= n) {
      if (la[i] <= lb[j]) {
        lc[l++] = la[i++];
      } else {
        lc[l++] = lb[j++];
      }
    }

    while (i <= m) {
      lc[l++] = la[i++];
    }
    while (j <= n) {
      lc[l++] = lb[j++];
    }
    for (int i = 1; i < l; i++) {
        if(i == l-1) cout << lc[i] << endl ;
        else
      cout << lc[i] << " ";
    }
  }

  return 0;
}

1114: 十六进制转换八进制

输入一个不超过100000位的十六进制数,请转换成八进制数。

注:十六进制数中,字母09还对应表示数字09。字母”A”(大写)表示10,”B”表示11,”...”,”F”表示15,比如:十六进制数A10B表示的是10进制数是10×163+1×162+0×161+11×160=41227。转换成的八进制数是120413,因为1×85+2×84+0×83+4×82+1×81+3×80=41227。

  • 先将16进制转化为2进制,然后转化为8进制,判断是否是3的倍数,否则填加前导0,使其为3的倍数
#include <bits/stdc++.h>

using namespace std;

map<char, string> mp;
map<string, string> mp1;

int main() {
  // 16进制转化为2进制
  mp['0'] = "0000", mp['1'] = "0001", mp['2'] = "0010", mp['3'] = "0011",
  mp['4'] = "0100", mp['5'] = "0101", mp['6'] = "0110", mp['7'] = "0111",
  mp['8'] = "1000", mp['9'] = "1001", mp['A'] = "1010", mp['B'] = "1011",
  mp['C'] = "1100", mp['D'] = "1101", mp['E'] = "1110", mp['F'] = "1111";

  // 2进制转化为8进制
  mp1["000"] = "0", mp1["001"] = "1", mp1["010"] = "2", mp1["011"] = "3",
  mp1["100"] = "4", mp1["101"] = "5", mp1["110"] = "6", mp1["111"] = "7";
  string str;
  while (cin >> str) {
    string s = "";
    for (int i = 0; i < str.size(); i++) {
      s += mp[str[i]];
    }

    int n = s.size();
    if (n % 3 == 2) s = "0" + s;
    if (n % 3 == 1) s = "00" + s;

    string ans = "";
    for (int i = 0; i < s.size(); i += 3) {
      ans += mp1[s.substr(i, 3)];
    }
    int flag = 0;
    for (int i = 0; i < ans.size(); i++) {
      if (ans[i] == '0' && flag == 0) {
        continue;
      } else {
        flag = 1;
      }
      cout << ans[i];
    }
    cout << endl;
  }

  return 0;
}