码迷,mamicode.com
首页 > 其他好文 > 详细

北京理工大学复试上机--2020

时间:2020-04-04 09:35:48      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:dir   iss   左右   组合   mes   pre   北京   while   for   

PS: 2020的是夏令营试题

1、题目:给你一个 m*n 大小的矩阵,每个点有 0,1,2 三种取值;0 代表障碍物,1代表白纸,2 代表墨滴。每一秒墨滴可以向其上下左右扩散,将四周的白纸染色,被染色之后的白纸可以继续向四周扩散,以此类推。问经过几秒,矩阵中所有的白纸都被染色。
如果可以,则输出扩散时间;
如果不可以,则输出FALSE。 
输入: m n 的大小以及矩阵每个点的值 
输出: 扩散时间 或 FALSE 
例如:
3 3
0 1 0
1 2 1
0 1 0
输出: 1

3 3
0 1 0
1 2 1
0 1 1
输出: 2

2 3
1 0 0
0 0 2
输出: False
 
#include <iostream>
#include <queue>
using namespace std;
int main() {
    int m, n;
    while (cin >> m >> n) {
        int arr[m][n];
        int temp = 0;
        queue<int> qx, qy;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cin >> arr[i][j];
                if(arr[i][j] == 2) {
                    qx.push(i);
                    qy.push(j);
                }
                if(arr[i][j] == 1) temp++;
            }
        }
        int sec = 0;
        while(!qx.empty() && temp) {
            int size = qx.size();
            int dir[5] = {1, 0, -1, 0, 1};
            while(size--) {
                int x = qx.front();
                int y = qy.front();
                qx.pop();
                qy.pop();
                for(int i = 0; i < 4; i++) {
                    int dx = x + dir[i];
                    int dy = y + dir[i + 1];
                    if(dx < 0 || dx >= m || dy < 0 || dy >= n || arr[dx][dy] != 1) continue;
                    else {
                        arr[dx][dy] = 2;
                        temp--;
                        qx.push(dx);
                        qy.push(dy);
                    }
                }
            }
            sec++;
        }
        if (temp) cout << "False" << endl;
        else cout << sec << endl;
    }
    return 0;
}

 

2、输入三个字符串,问第三个字符串能否由前两个字符串多次重复组合形成。如果能,则输出前两个字符串各自的使用次数;如果不能,则输出 FALSE。 
输入:三个字符串 
输出:前两个字符串各自的次数 或 FALSE 
输入: aa bb bbaaaabbaa 
输出: 3 2 
输入: ab ba abbaaabaab 
输出: FALSE 
(注意特殊用例: aa aab aabaa  故递归)
#include <iostream>
#include <queue>
using namespace std;

queue<string> st;

bool sub(string s1, string s, int n) {
    return s.substr(n, s1.length()) == s1;
}

bool issub(string s1, string s2, string s, int p, int rem) {
    if(p == s.length() && rem == 0) return true;
    if(sub(s1, s, p) && sub(s2, s, p)) st.push(s.substr(p, rem));
    if(sub(s1, s, p)) {
        rem -= s1.length();
        p += s1.length();
        issub(s1, s2, s, p, rem);
    }
    if(sub(s2, st.front(), p)) {
        st.pop();
        rem -= s2.length();
        p += s2.length();
        issub(s1, s2, s, p, rem);
    }
    return true;
}

int main() {
    string s1, s2, s;
    while(cin >> s1 >> s2 >> s) {
        int l = s.length();
        cout << issub(s1, s2, s, 0, l);
    }
    return 0;
}

 

PS: 暂时是更新完了,综合面试也是一个大头,都抓紧吧,尽量不手生,多看 多练  加油!!!!  Fighting!!!  (别忘了前面未完善的!!)

北京理工大学复试上机--2020

标签:dir   iss   左右   组合   mes   pre   北京   while   for   

原文地址:https://www.cnblogs.com/ache/p/12630070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!