网易游戏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; } } }第三题没思路,就是手势解锁的可能次数那个,希望董的大佬说一下思路……