中石大第40次CSP培训Week1题解

A.统计数字


思路

map

AC代码

    int n;
    map<int, int> mp;

    void solve(){
        cin >> n;
        for(int i = 1; i <= n ; i ++ ){
            int x;
            cin >> x;
            mp[x] ++;
        }
        for(auto i :mp){
            cout << i.first << " "<< i.second << endl;
        }
        return ;
    }

B.魔法少女小Scarlet


思路

模拟

AC代码

    int n, m;
    int g[N][N];
    int t[N][N];
    int e = 1;

    void f(int x0, int y0, int l, int z){
        
        if (z == 0){ 
            for(int i = 1; i <= l ; i ++ ){
                for(int j = 1 ; j <= l; j ++ ){
                    t[j][l - i + 1] = g[x0 + i - 1][y0 + j - 1];
                    /*
                    拆解:
                    t[i][j] = g[x0 + i - 1][y0 + j - 1];
                    t[j][l - i + 1] = t[i][j];
                    */
                }
            }
            for(int i = 1; i <= l ; i ++ ){
                for(int j = 1 ; j <= l; j ++ ){
                    g[x0 + i - 1][y0 + j - 1] = t[i][j];
                }
            }
        }
        else{
            for(int i = 1; i <= l ; i ++ ){
                for(int j = 1 ; j <= l; j ++ ){
                    t[l - j + 1][i] = g[x0 + i - 1][y0 + j - 1];
                }
            }
            for(int i = 1; i <= l ; i ++ ){
                for(int j = 1 ; j <= l; j ++ ){
                    g[x0 + i - 1][y0 + j - 1] = t[i][j];
                }
            }
        }
        
        return ;
    }

    void solve(){
        cin >> n >> m;
        e = 1;
        for(int i = 1; i <= n ; i ++ ){
            for(int j = 1 ; j <= n ; j ++ ){
                g[i][j] = e;
                e ++;
            }
        }
        while( m -- ){
            int x, y, r, z;
            cin >> x >> y >> r >> z;
            int x0 = x - r;
            int y0 = y - r;
            int l = 2 * r + 1;
            f(x0, y0, l, z);
        }
        for(int i = 1; i <= n ; i ++ ){
            for(int j = 1 ; j <= n ; j ++ ){
                cout << g[i][j] << " ";
            }
            cout << endl;
        }
        return ;
    }

C.第39次CSP认证第二题—水印检查


思路

模拟

AC代码

    int n, l;
    int csp[5][9];
    int g[N][N];
    map<int,int> ans;//可能会重复,使用map去掉重复的元素

    void init() {
        csp[1][1] = csp[1][2] = csp[1][4] = csp[1][5] = csp[1][7] = 1;
        csp[2][1] = csp[2][2] = csp[2][8] = 1;
        csp[3][1] = csp[3][2] = csp[3][3] = csp[3][4] = csp[3][7] = csp[3][8] = 1;
        csp[4][7] = csp[4][8] = 1;
    }


    void solve(){
        cin >> n >> l;
        for(int i = 1; i <= n ; i ++ ){
            for(int j = 1 ; j <= n ; j ++ ){
                cin >> g[i][j];
            }
        }
        init();
        for(int k = 0; k <= l - 1; k ++ ){
            bool key = false;
            for(int i = 1 ; i <= n - 4; i ++ ){
                for(int j = 1; j <= n - 8 ;j ++ ){
                    int num = 0;
                    for(int x = 0; x <= 4; x ++ ){
                        for(int y = 0; y <= 8; y ++ ){
                            if(csp[x][y] == 0 && g[i + x][j + y] >= k)num ++ ;
                            else if(csp[x][y] == 1 && g[i + x][j + y] < k)num ++;
                        }
                    }
                    if(num == 5 * 9)key = true;
                }
            }
            if(key)ans[k]++;
        }
        for(auto & i: ans)cout << i.first << endl;
        return ;
    }

D.健康的荷斯坦奶牛 Healthy Holsteins


思路

DFS

AC代码

    int n, m;
    int a[N];
    int g[N][N];
    bool st[N];
    string  ans(30,'a');

    void dfs(int x){
        if(x > m){
            string t = "";
            int sum[N];
            memset(sum, 0 ,sizeof sum);
            for(int i = 1; i <= m ; i ++ ){
                if(st[i]){
                    t += (char)(i + '0');
                    for(int j = 1; j <= n ; j ++ ){
                        sum[j] += g[i][j];
                    }
                }
                
            }
            //cout << t << "->" ;
            for(int i = 1; i <= n ; i ++ ){
                //cout << sum[i] << "->" << a[i] << endl;
                if(sum[i] < a[i]){
                    //cout << "No" << endl;
                    return ;
                }
            }
            //cout << "Yes" << endl;
            if(ans.size() > t.size()){
                ans = t;
            }
            else if(ans.size() == t.size() && ans > t){
                ans = t;
            }
            //cout << ans << endl;
            return ;
        }

        st[x] = true;
        dfs(x + 1);
        st[x] = false;
        dfs(x + 1);
        return ;
    }


    void solve(){
        cin >> n ;
        for(int i = 1 ; i <= n ; i ++ ){
            cin >> a[i];
        }
        cin >> m;
        for(int i = 1; i <= m ; i ++ ){
            for(int j = 1; j <= n ; j ++ ){
                cin >> g[i][j];
            }
        }
        memset(st, false, sizeof st);
        dfs(1);
        cout << ans.size() << " ";
        for(auto i : ans){
            cout << i - '0' << " ";
        }
        return ;
    }

E.第38次CSP认证第二题:机器人复健指南


思路

BFS

AC代码

    int n, k;
    int sx, sy;
    int dx[8] = {2, 2, 1, 1, -2, -2, -1, -1};
    int dy[8] = {1, -1, 2, -2, 1, -1, 2, -2};
    int num[N][N];
    int ans = 1;

    void bfs(){
        queue<PII> q;
        memset(num, -1, sizeof num);
        num[sx][sy] = 0;
        q.push({sx, sy});
        while(q.size()){
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            for(int i = 0; i < 8; i ++ ){
                int x0 = x + dx[i];
                int y0 = y + dy[i];
                if(x0 >= 1 && x0 <= n && y0 >= 1 && y0 <= n && num[x0][y0] == -1){
                    ans ++;
                    num[x0][y0] = num[x][y] + 1;
                    if(num[x0][y0] < k)q.push({x0, y0});
                }
            }
        }
    }

    void solve(){
        cin >> n >> k >> sx >> sy;
        bfs();
        cout << ans << endl;
        return ;
    }
posted @ 2025-11-25 20:13  Oaths  阅读(143)  评论(0)    收藏  举报