网易游戏8月27日笔试

AC情况:2/3
第一题:
#include <iostream>
#include<vector>
using namespace std;
int main() {
    int T;
    while(cin >> T){// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
        int N, M;
        
//         vector<vector<int>> m(M, vector<int>(M));
        for(int t=0;t<T;t++){
            cin>>N>>M;
            vector<vector<char>> n(N, vector<char>(N));
            for(int i=0;i<N;i++){
                for(int j=0;j<N;j++){
                    cin>>n[i][j];
                }
            }
//             cout<<endl;
//             cout<<"qw";
            int start = 1;//start 代表的是最少需要start个基本模板才可以包括整个墙面
            while(start*N<M) start+=2;
            int changex =  (start*N - M)/2, changey =  (start*N - M)/2; //求的是“多余的边”的长度,就是start*N多出来的那部分
            int real_x , real_y; //real_x 代表的是现在的位置,投影到基础模板上的位置,real_y同理
            
            for(int row = 0;row < M;row++){
                for(int col = 0;col < M;col++){
                    real_x = (row + changex)%N;
                    real_y = (col + changex)%N;
                    cout<<n[real_x][real_y];
                }
                cout<<endl;
            }
            
            cout<<endl;
        }
    }
}
第二题:
#include <iostream>
#include<vector>
#include<unordered_map>
using namespace std;

int countArea(vector<int> &v1, vector<int> &v2){
    int maxx0 = max(v1[0], v2[0]);
    int minx1 = min(v1[2], v2[2]);
    int maxy0 = max(v1[1], v2[1]);
    int miny1 = min(v1[3], v2[3]);
    if(maxx0 >= minx1 || maxy0 >= miny1) return 0;
    int S1 = (v1[3]-v1[1])*(v1[2]-v1[0]), S2 = (v2[3]-v2[1])*(v2[2]-v2[0]);
    int S3 = (minx1 - maxx0)*(miny1 - maxy0);
    return S1+S2 - S3;
}

int main() {
    int T;
    while(cin >> T){// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
        int N;
        for(int t = 0;t<T;t++){
            cin>>N;
            vector<vector<int>> map(N, vector<int>(4));
            for(int i=0;i<N;i++){
                for(int j=0;j<4;j++){
                    cin>>map[i][j];
                }
            }
            unordered_map<int, int> cnt;
            int res = 0;
            for(int k=0;k<N;k++){
                for(int p=k+1;p<N;p++){
                    if(cnt.count(p) || cnt.count(k)) continue;
                    int area = countArea(map[k], map[p]);
                    if(area != 0){
                        cnt[p] = 0;
                        cnt[k] = 0;
                        res += area;
                    }
                }
            }
            cout<<res<<endl;
            
            
        }
    }
}
第三题没思路,就是手势解锁的可能次数那个,希望董的大佬说一下思路……


#网易互娱##网易笔试#
全部评论
int start = 1; while(start*N<M) start+=2; int changex =  (start*N - M)/2, changey =  (start*N - M)/2; 老哥我想问问这几步是在做什么变换?
点赞 回复 分享
发布于 2022-08-27 22:22 北京
手势解锁我用的状态压缩+dfs,但路径记录太复杂了,通过了用例但提交超时了
1 回复 分享
发布于 2022-08-27 22:39 浙江
同样A两道,第三题没时间,第三题我的思路还是遍历所有可能,记录状态,没想到啥好点子
点赞 回复 分享
发布于 2022-08-27 22:06 英国
第二题每个矩阵最多和一个矩阵相交吗...
点赞 回复 分享
发布于 2022-08-27 22:55 北京
第一题给分享个更简洁的做法
点赞 回复 分享
发布于 2022-08-28 11:06 山东

相关推荐

评论
7
3
分享
牛客网
牛客企业服务