牛客网-2017网易游戏雷火盘古实习生招聘笔试真题-解题思路及源码

一、字符串编码

字符串,按照题意进行编程就行。

#include
using namespace std;
int main()
{
	string s;
	cin>>s;
	char c=s[0];
	int cnt=1;
	for(int i=1;i
二、最大和

本题目一定要注意题意中对构成最大和的数字数量为D,然后对二维数组进行遍历,逐个判断就行。

#include
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>G[i][j];
	int res=0;
	for(int i=0;i=0&&k
三、推箱子

本题目采用BFS求解最短路,遍历玩家的移动,当玩家移动到箱子的点的时候,那么箱子的坐标就改变。当箱子的坐标和目的地坐标相同时,则到达目的地。一定要适合只一个vis数组来表示现在的状态,避免重复遍历。下面代码中设置的vis[maxn][maxn][maxn][maxn]表示玩家的位置和箱子的位置状态。另外要注意当箱子在边界的时候,会出现推不动的状况。

#include
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 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;
			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>s;
		for(int j=0;j
四、赛马

本题目是一个概率题目,位置在最前的马不会被淘汰的概率为1/N,位置在第二前的马不会被淘汰的概率为1/(N-1).通过递归求解就可以得答案。

#include
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;
}





你可能感兴趣的:(牛客网笔试题)