阿里巴巴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;
} 
