您的位置:首页 > 其它

牛客网-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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: