牛客网-2017网易游戏雷火盘古实习生招聘笔试真题-解题思路及源码
2018-02-02 22:32
666 查看
一、字符串编码
字符串,按照题意进行编程就行。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
char c=s[0];
int cnt=1;
for(int i=1;i<s.length();i++)
{
if(c==s[i])
{
cnt++;
}
else
{
cout<<cnt<<c;
c=s[i];
cnt=1;
}
}
cout<<cnt<<c<<endl;
return 0;
} 二、最大和
本题目一定要注意题意中对构成最大和的数字数量为D,然后对二维数组进行遍历,逐个判断就行。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
int main()
{
//freopen("datain.txt","r",stdin);
int N,D,G[maxn][maxn];
cin>>N>>D;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
cin>>G[i][j];
int res=0;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
int tmp=0,k=0;
for(k=0;j+k<N&&k<D;k++)
tmp+=G[i][j+k];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&k<D;k++)
tmp+=G[i+k][j];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&j+k<N&&k<D;k++)
tmp+=G[i+k][j+k];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&j-k>=0&&k<D;k++)
tmp+=G[i+k][j-k];
if(res<tmp&&k==D) res = tmp;
}
cout<<res<<endl;
return 0;
}三、推箱子
本题目采用BFS求解最短路,遍历玩家的移动,当玩家移动到箱子的点的时候,那么箱子的坐标就改变。当箱子的坐标和目的地坐标相同时,则到达目的地。一定要适合只一个vis数组来表示现在的状态,避免重复遍历。下面代码中设置的vis[maxn][maxn][maxn][maxn]表示玩家的位置和箱子的位置状态。另外要注意当箱子在边界的时候,会出现推不动的状况。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
struct state
{
int npx,npy;
int nboxx,nboxy;
int nstep;
};
int vis[maxn][maxn][maxn][maxn];
int G[maxn][maxn];
int boxx,boxy,px,py,dx,dy;
//px玩家位置,dx为目标点
int moved[4][2] ={{-1,0},{1,0},{0,-1},{0,1}};
int N,M;
int ans=-1;
void solve()
{
queue<state> q;
state ini={px,py,boxx,boxy,0};
q.push(ini);
vis[px][py][boxx][boxy]=1;
while(!q.empty())
{
state now = q.front();
q.pop();
for(int i=0;i<4;i++)
{
int newx= now.npx+moved[i][0];
int newy= now.npy+moved[i][1];
int newnboxx=now.nboxx,newnboxy=now.nboxy;
if(newx<0||newx>N-1) continue;
if(newy<0||newy>M-1) continue;
if(G[newx][newy]) continue;
4000
if(now.npy==now.nboxy&&newx==0&&now.nboxx==0) continue;
if(now.npy==now.nboxy&&newx==N-1&&now.nboxx==N-1) continue;
if(now.npx==now.nboxx&&newy==0&&now.nboxy==0) continue;
if(now.npx==now.nboxx&&newy==M-1&&now.nboxy==M-1) continue;
if(newx==now.nboxx&&newy==now.nboxy)
{
newnboxx = now.nboxx+moved[i][0];
newnboxy = now.nboxy+moved[i][1];
}
if(newnboxx==dx&&newnboxy==dy)
{
ans = now.nstep+1;
return ;
}
else
{
if(!vis[newx][newy][newnboxx][newnboxy])
{
state next={newx,newy,newnboxx,newnboxy,now.nstep+1};
vis[newx][newy][newnboxx][newnboxy]=1;
q.push(next);
}
}
}
}
}
int main()
{
//freopen("datain.txt","r",stdin);
cin>>N>>M;
getchar();
for(int i=0;i<N;i++)
{
string s;
cin>>s;
for(int j=0;j<M;j++)
{
if(s[j]=='.') G[i][j]=0;
if(s[j]=='#') G[i][j]=1;
if(s[j]=='*')
{
G[i][j]=0;
boxx=i;boxy=j;
}
if(s[j]=='@')
{
G[i][j]=0;
dx=i;dy=j;
}
if(s[j]=='X')
{
G[i][j]=0;
px=i;py=j;
}
}
}
solve();
cout<<ans<<endl;
return 0;
} 四、赛马
本题目是一个概率题目,位置在最前的马不会被淘汰的概率为1/N,位置在第二前的马不会被淘汰的概率为1/(N-1).通过递归求解就可以得答案。
#include<bits/stdc++.h>
using namespace std;
double solve(int n)
{
if(n==1)
return 1;
else
return 1/double(n)+solve(n-1);
}
int main()
{
int N;
cin>>N;
printf("%.4f",solve(N));
return 0;
}
字符串,按照题意进行编程就行。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
char c=s[0];
int cnt=1;
for(int i=1;i<s.length();i++)
{
if(c==s[i])
{
cnt++;
}
else
{
cout<<cnt<<c;
c=s[i];
cnt=1;
}
}
cout<<cnt<<c<<endl;
return 0;
} 二、最大和
本题目一定要注意题意中对构成最大和的数字数量为D,然后对二维数组进行遍历,逐个判断就行。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
int main()
{
//freopen("datain.txt","r",stdin);
int N,D,G[maxn][maxn];
cin>>N>>D;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
cin>>G[i][j];
int res=0;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
int tmp=0,k=0;
for(k=0;j+k<N&&k<D;k++)
tmp+=G[i][j+k];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&k<D;k++)
tmp+=G[i+k][j];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&j+k<N&&k<D;k++)
tmp+=G[i+k][j+k];
if(res<tmp&&k==D) res = tmp;
tmp = 0;
for(k=0;i+k<N&&j-k>=0&&k<D;k++)
tmp+=G[i+k][j-k];
if(res<tmp&&k==D) res = tmp;
}
cout<<res<<endl;
return 0;
}三、推箱子
本题目采用BFS求解最短路,遍历玩家的移动,当玩家移动到箱子的点的时候,那么箱子的坐标就改变。当箱子的坐标和目的地坐标相同时,则到达目的地。一定要适合只一个vis数组来表示现在的状态,避免重复遍历。下面代码中设置的vis[maxn][maxn][maxn][maxn]表示玩家的位置和箱子的位置状态。另外要注意当箱子在边界的时候,会出现推不动的状况。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
struct state
{
int npx,npy;
int nboxx,nboxy;
int nstep;
};
int vis[maxn][maxn][maxn][maxn];
int G[maxn][maxn];
int boxx,boxy,px,py,dx,dy;
//px玩家位置,dx为目标点
int moved[4][2] ={{-1,0},{1,0},{0,-1},{0,1}};
int N,M;
int ans=-1;
void solve()
{
queue<state> q;
state ini={px,py,boxx,boxy,0};
q.push(ini);
vis[px][py][boxx][boxy]=1;
while(!q.empty())
{
state now = q.front();
q.pop();
for(int i=0;i<4;i++)
{
int newx= now.npx+moved[i][0];
int newy= now.npy+moved[i][1];
int newnboxx=now.nboxx,newnboxy=now.nboxy;
if(newx<0||newx>N-1) continue;
if(newy<0||newy>M-1) continue;
if(G[newx][newy]) continue;
4000
if(now.npy==now.nboxy&&newx==0&&now.nboxx==0) continue;
if(now.npy==now.nboxy&&newx==N-1&&now.nboxx==N-1) continue;
if(now.npx==now.nboxx&&newy==0&&now.nboxy==0) continue;
if(now.npx==now.nboxx&&newy==M-1&&now.nboxy==M-1) continue;
if(newx==now.nboxx&&newy==now.nboxy)
{
newnboxx = now.nboxx+moved[i][0];
newnboxy = now.nboxy+moved[i][1];
}
if(newnboxx==dx&&newnboxy==dy)
{
ans = now.nstep+1;
return ;
}
else
{
if(!vis[newx][newy][newnboxx][newnboxy])
{
state next={newx,newy,newnboxx,newnboxy,now.nstep+1};
vis[newx][newy][newnboxx][newnboxy]=1;
q.push(next);
}
}
}
}
}
int main()
{
//freopen("datain.txt","r",stdin);
cin>>N>>M;
getchar();
for(int i=0;i<N;i++)
{
string s;
cin>>s;
for(int j=0;j<M;j++)
{
if(s[j]=='.') G[i][j]=0;
if(s[j]=='#') G[i][j]=1;
if(s[j]=='*')
{
G[i][j]=0;
boxx=i;boxy=j;
}
if(s[j]=='@')
{
G[i][j]=0;
dx=i;dy=j;
}
if(s[j]=='X')
{
G[i][j]=0;
px=i;py=j;
}
}
}
solve();
cout<<ans<<endl;
return 0;
} 四、赛马
本题目是一个概率题目,位置在最前的马不会被淘汰的概率为1/N,位置在第二前的马不会被淘汰的概率为1/(N-1).通过递归求解就可以得答案。
#include<bits/stdc++.h>
using namespace std;
double solve(int n)
{
if(n==1)
return 1;
else
return 1/double(n)+solve(n-1);
}
int main()
{
int N;
cin>>N;
printf("%.4f",solve(N));
return 0;
}
相关文章推荐
- 2017网易游戏雷火盘古实习生招聘笔试真题 推箱子
- 2017网易游戏雷火盘古实习生招聘笔试真题 第四题
- 2017网易游戏雷火盘古实习生招聘笔试真题:赛马 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:最大和 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:推箱子 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:字符串编码 [python]
- 牛客网-网易2017春招笔试真题编程题集合-解题思路及源码
- 2018网易游戏雷火盘古实习生招聘笔试真题
- 2017网易游戏雷火盘古实习生招聘笔试:最大和
- 名企笔试:网易游戏雷火盘古2017实习生招聘笔试题(字符串编码)
- 2017网易游戏雷火盘古实习生招聘笔试:字符串编码
- 2017网易游戏雷火盘古实习生招聘笔试(4)赛马
- 牛客网-网易2018校园招聘编程题真题集合-解题思路及源码
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(图像处理)
- 牛客网-网易2017秋招编程题集合-解题思路及源码
- 2017网易雷火盘古实习生招聘编程题之字符串编码——LZ压缩
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场 C
- 2018网易游戏雷火盘古实习生笔试
- hihocoder 网易游戏2016实习生招聘在线笔试 解题报告