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

一、字符串编码

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

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





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值