阿里巴巴4.27笔试
1.维护前后左右四个数据。
当右翻时,当前底部变为左侧,底部所对的位置变为右侧。
当左翻时,当前底部变为右侧,底部所对的位置变为左侧。
当前翻时,当前底部变为后侧,底部所对的位置变为前侧。
当后翻时,当前底部变为前侧,底部所对的位置变为后侧。
往哪个方向翻转,则下一个位置的值就是那个方向的数据。往前翻,就是当前前位置的数据。
注意: 1和6相对
5和2相对
3和4相对。
代码:
#include<bits/stdc++.h> using namespace std; map<pair<int,int>,int>m; map<int,int>t; vector<pair<int,int>>dir{{0,1},{0,-1},{-1,0},{1,0}}; void init(){ t[1]=6; t[6]=1; t[2]=5; t[5]=2; t[3]=4; t[4]=3; m[{0,1}]=2; m[{0,-1}]=5; m[{1,0}]=3; m[{-1,0}]=4; } void process(pair<int,int>start,vector<vector<char>>&nums){ int n=nums.size(); int now=6; queue<pair<int,int>>Q; Q.push(start); nums[start.first][start.second]=now+'0'; while(!Q.empty()){ auto p=Q.front(); Q.pop(); nums[p.first][p.second]=now+'0'; for(auto d:dir){ int x=d.first+p.first; int y=d.second+p.second; if(x>=0&&x<n&&y>=0&&y<n){ if(nums[x][y]=='#'||nums[x][y]=='E'){ int bottom=now; now=m[d];//转换一下 if(d.first==0&&d.second==1){//往右转换 m[{0,-1}]=bottom; m[{0,1}]=t[bottom]; } if(d.first==0&&d.second==-1){ m[{0,1}]=bottom; m[{0,-1}]=t[bottom]; } if(d.first==1&&d.second==0)//往上 { m[{-1,0}]=bottom; m[{1,0}]=t[bottom]; } if(d.first==-1&&d.second==0){ m[{1,0}]=bottom; m[{-1,0}]=t[bottom]; } Q.push({x,y}); } } } } } int main(){ int T; cin>>T; while(T--){ init(); int n; cin>>n; vector<vector<char>>nums(n,vector<char>(n)); pair<int,int>start; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>nums[i][j]; if(nums[i][j]=='S'){ start.first=i; start.second=j; } } } process(start,nums); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<nums[i][j]; } cout<<endl; } } }第二题:
暴力dfs。过了0.1。
#include<bits/stdc++.h> using namespace std; void process(int& H1,int A1,int D1,int H2,int A2,int D2){ int step=0; while(H1>0&&H2>0){ if(step==0){ step=1; H2-=max(A1-D2,1); } else{ step=0; H1-=max(A2-D1,1); } } return; } void dfs(int H,int A,int D,int idx,vector<vector<int>>&nums,int& res){ res=max(res,idx); if(idx==nums.size()){ return; } process(H,A,D,nums[idx][0],nums[idx][1],nums[idx][2]); if(H<0){ return; } else{ H+=1000; dfs(H,A,D,idx+1,nums,res); H-=1000; A+=10; dfs(H,A,D,idx+1,nums,res); A-=10; D+=10; dfs(H,A,D,idx+1,nums,res); D-=10; } } int main(){ //dfs int H,A,D,n; cin>>H>>A>>D>>n; vector<vector<int>>nums(n,vector<int>(3)); for(int i=0;i<n;i++){ for(int j=0;j<3;j++){ cin>>nums[i][j]; } } int res=0;//表示最大值 process(H,A,D,nums[0][0],nums[0][1],nums[0][2]); if(H<0){ cout<<res<<endl; return 0; } int x=H; H+=1000; dfs(H,A,D,1,nums,res); H-=1000; A+=10; dfs(x,A,D,1,nums,res); A-=10; D+=10; dfs(x,A,D,1,nums,res); D-=10; cout<<res<<endl; return 0; }