网易游戏雷火盘古招聘题(一)

网易游戏雷火盘古招聘题(一)
  [编程题]赛马
在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少
输入描述:
每个测试输入包含1个测试用例输入只有一行,一个正整数N1 <= N <= 1000
输出描述:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望
输入例子:
1
2
输出例子:
1.0000 1.5000 
思路:
对于最后一匹马而言, 它没有办法被其他马追上(因为它后面已经没马了),所以它不会出局,他存活的概率就是1,对于倒数第二匹而言,他只有被后面1匹马追上,或者不被追上 所以是1/2,同理,倒数第三匹1/3…………所以n匹马就是1/1+1/2+1/3+1/4+………+1/n.。
代码实现(C/C++):  
#include <iostream>
#include <iomanip>      //使用小数格式控制时使用的头文件
using namespace std;

int main(){
    double sum = 0;
    int n;
    cin >> n;
    for(int i=1; i<=n; i++){
        sum += 1*1.0/i;
    }
    //fixed << setprecision(i)   用来控制 小数点后面的位数,i为具体的位数 
    cout << fixed  << setprecision(4) << sum;
    return 0;


[编程题]字符串编码
给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成
4A1B2C1D2A。
输入描述:
每个测试输入包含1个测试用例每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。
输出描述:
输出编码后的字符串
输入例子:
AAAABCCDAA
输出例子:
4A1B2C1D2A
 思路:
解题的着眼点在于每2个字母是否相同,根据这个实现思路有很多,其实最简洁的的应该是用正则表达式,我用的比较笨的方法。。。
代码实现(C/C++):  
   #include <iostream>
#include <string.h>
using namespace std;
void tihuan(char c[] );
int main()
{
    //string s;
    char * s = new char[2048];
    cin >> s;
    tihuan(s);
}
void tihuan(char c[])
{
    int j=1;
    for(int i=0; i<= strlen(c); i++)
    {
        char a = c[i];
        char b = c[i+1];
        if(a!=b && i != strlen(c))
        {
            cout << j << a;
            j=0;
        }
        j++;
    }
}



[编程题]最大和
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :3 <= N <= 1001 <= D <= N接下来有N行,每行N个数字d:0 <= d
<= 100
输出描述:
输出一个整数,表示找到的和的最大值
输入例子:
4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0
输出例子:
193
 思路:
 一种简单粗暴一个一个遍历,另一种是递归。下面是我照的网上一个人写的递归算法
代码实现(C/C++): 
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <stack>
using namespace std;
int ans;
int n,d;
int a[104][104];
  
void dfs(int sum,int cnt,int x,int y,int op){
    sum += a[x][y];
    cnt += 1;
    if (cnt == d) ans = max(ans,sum);
    else if (op == 1) dfs(sum,cnt,x+1,y,op);
    else if (op == 2) dfs(sum,cnt,x,y+1,op);
    else if (op == 3) dfs(sum,cnt,x+1,y+1,op);
    else if (op == 4) dfs(sum,cnt,x-1,y+1,op);
}
  
int main(){
      
    cin >> n >> d; 
    ans = 0;
    for (int i=1; i<=n; ++i) for (int j=1; j<=n;++j) cin >> a[i][j];
    for (int i=1; i<=n; ++i) for (int j=1; j<=n;++j) {
        if (i + d - 1 <= n) dfs(0,0,i,j,1);
        if (j + d - 1 <= n) dfs(0,0,i,j,2);
        if (i + d - 1 <= n && j + d - 1 <= n) dfs(0,0,i,j,3);
        if (i - d + 1 >= 1 && j + d - 1 <= n) dfs(0,0,i,j,4);
    }
    cout << ans << endl;
      
    return 0;
}

 

[编程题]推箱子
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地
。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移
动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,
请你求出玩家最少需要移动多少步才能够将游戏目标达成。
输入描述:
每个测试输入包含1个测试用例第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。接下来有N行,每行包含M个字符表示该行地
图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。每个地图必定包含1个玩家、1个箱子、1个目的地。
输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。
输入例子:
4 4
....
..*@
....
.X..
6 6.
..#...
.....#
*##...
.##.#.
.X....
@#...
输出例子:
3
11
 思路:
。。。。。。。我也不会 等我研究完再说。
代码实现(C/C++): 
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
 
int n,m,x1,x2,x3,y1,y2,y3;
char map[10][10],flag[8][8][8][8];
int value[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
 
int ABS(int a){
    return a>=0?a:-a;
}
 
struct node{
    int x,y,a,b,t;
    bool operator < (const node &temp) const {
        return t+ABS(a-x3)+ABS(b-y3) > temp.t+ABS(temp.a-x3)+ABS(temp.b-y3);
    }
};
 
int BFS(){
    int i;
    node temp1,temp2;
    priority_queue<node> q;
    temp1.x = x1;
    temp1.y = y1;
    temp1.a = x2;
    temp1.b = y2;
    temp1.t = 0;
    flag[temp1.x][temp1.y][temp1.a][temp1.b] = 1;
    q.push(temp1);
    while(!q.empty()){
        temp1 = q.top();
        q.pop();
        temp2.t = temp1.t+1;
        for(i=0;i<4;i++){
            temp2.a = temp1.a;
            temp2.b = temp1.b;
            temp2.x = temp1.x+value[i][0];
            temp2.y = temp1.y+value[i][1];
            if(temp2.x>=0 && temp2.x<m && temp2.y>=0 && temp2.y<n && map[temp2.y][temp2.x] != '#'){
                if(temp2.x == temp2.a && temp2.y == temp2.b){
                    if(i == 0){
                        temp2.a++;
                    }
                    else if(i == 1){
                        temp2.a--;
                    }
                    else if(i == 2){
                        temp2.b++;
                    }
                    else{
                        temp2.b--;
                    }
                    if(!(temp2.a>=0 && temp2.a<m && temp2.b>=0 && temp2.b<n && map[temp2.b][temp2.a] != '#')) continue;
                }
                if(temp2.a == x3 && temp2.b == y3) return temp2.t;
                if(flag[temp2.x][temp2.y][temp2.a][temp2.b]) continue;
                flag[temp2.x][temp2.y][temp2.a][temp2.b] = 1;
                q.push(temp2);
            }
        }
    }
    return -1;
}
 
int main(){
    int i,j;
    cin>>n>>m;
    for(i=0;i<n;i++) cin>>map[i];
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            if(map[i][j] == 'X'){
                x1 = j;
                y1 = i;
            }
            if(map[i][j] == '*'){
                x2 = j;
                y2 = i;
            }
            if(map[i][j] == '@'){
                x3 = j;
                y3 = i;
            }
        }
    }
    memset(flag,0,sizeof(flag));
    cout<<BFS()<<endl;
    return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值