2019网易雷火笔试编程题

在网络游戏中,可见关系计算是一个非常重要的模块。有大量的功能关心一个玩家进入了另外一个玩家的视野,或者一个玩家离开了另外一个玩家的视野。
在这个题目里,我们简化了一下模型:

  1. 游戏场景是一个固定大小的二维地图,宽高分别为W和H。即坐标范围为(0, 0) ~ (W-1, H-1),且都为整数,允许不同的玩家站在同一个坐标上。
  2. 场景里有N个玩家,编号为0到N-1,初始时根据输入随机分布在各个坐标上。
  3. 玩家的视野统一为S,是一个正方形,即当玩家坐标为 (X,Y)时,他能看到范围为(X-S, Y-S)到(X+S, Y+S)这个正方形以内的其他玩家,包括这个边界坐标。
  4. 在接下来的T秒时间里,每秒这N个玩家会根据编号顺序依次产生一次移动,移动的方向由一个随机数生成器产生。
    4.1 随机数生成器生成的序列为 R(i) = (R(i-1) * 21401 + 25301) % 98765,其中序列的第0项 R0是由外部输入得到。
    4.2 第一秒第一个玩家的运动方向为R1 % 4,第一秒第二个玩家运动方向为R2 % 4,依次类推,一共产生N*T个随机数。
    4.3 假定玩家当前坐标为(X,Y),当随机出来方向为0的时候,玩家坐标变为(X-1,Y); 方向为1时,玩家坐标变为(X,Y+1); 方向为2时,玩家坐标变为(X+1,Y); 方向为3时,玩家坐标变为(X,Y-1)。
    4.4 如果玩家移动坐标将超出地图范围,则玩家停留在原地不动。
  5. 当玩家位置移动以后则可能产生跟其他玩家的可见关系的变动,比如原来A看不到B,移动以后能看到,则会产生A进入B视野和B进入A视野两个事件。反之如果原来A能看到B,移动以后看不到,则产生A离开B视野和B离开A视野两个事件。

现在,在给定的情况下,需要你帮忙计算一下,每一秒产生的进入视野事件和离开视野事件的数量。
需要注意的是,同一秒里玩家的移动也是有先后顺序的,所以可能产生在同一秒里A移动一步离开了B的视野,然后B又移动一步重新进入了A的视野。
输入描述:
每个测试输入包含1个测试用例
第一行为6个整数W,H,N,S,T,R0。含义见题目描述,范围: 0 接下来有N行,每行两个整数 X,Y, 依次表示这N个玩家的初始坐标,范围 0<=X 输出描述:
输出T行,每行两个数字E,L,分别表示这T秒里,每秒分别产生的进入视野事件数量和离开视野事件数量。

INPUT:
5 5 3 1 2 123
1 2
2 0
3 3

OUTPUT:
2 2
2 0

乍一看这道题,满脑子都是暴力啊。。。把它想得太复杂了。时间结束后想了一下,其实题目不难。
题解:
观察题目我们发现,每个人动一下用到了随机数,也就是强制我们在线处理,这个处理过程并不复杂,4个方向可以用数组来表示
刚开始的思路是每个人动一下,和其他人的关系会发生改变,与此同时,其他人和其他人之前的关系并不会发生改变。
因此可以用N*N*t的复杂度暴力解决问题,可以过20%的case
但仔细一想我们发现每次每个人移动,带来的格子变化有多少呢?两排。

2019网易雷火笔试编程题_第1张图片
也就是说我们可以利用此进行计算了

希望代码可以看懂~

#include 
using namespace std;
struct node
{
	int x,y;
}p[10200];
int r[1102000];
int dx[4][2]={
	{-1,0},
	{0,1},
	{1,0},
	{0,-1},
};
int w,h,n,s,t;
bool valid(int x,int y){
	return x>=0&&x<=w-1&&y>=0&&y<=h-1;
}
int G[1024][1024];
int ask(int x,int y){
	if(x<0||y<0||x>=w||y>=h) return 0;
	return G[x][y];
}
int main(){
	cin>>w>>h>>n>>s>>t>>r[0];
	for(int i=1;i<=n;++i){
		cin>>p[i].x>>p[i].y;
		G[p[i].x][p[i].y]++;
	}
	int cnt = 0;
	for(int i=1;i<=t;++i){
		int jin = 0;
		int li = 0;
		for(int j=1;j<=n;++j){	
			int temp = r[cnt+1] = (r[cnt]*21401+25301)%98765;
			++cnt;
			temp&=3;
			int sx = p[j].x+dx[temp][0];
			int sy = p[j].y+dx[temp][1];
			bool flag = valid(sx,sy);
			if(!flag) continue;
			G[p[j].x][p[j].y]--;
			G[sx][sy]++;
			p[j].x = sx;
			p[j].y = sy;
			if(temp==0){//左边
				for(int q=sy-s;q<=sy+s;++q){
					jin += 2*ask(sx-s,q);
					li += 2*ask(sx+s+1,q);
				}
			}
			else if(temp==2){//右边
				for(int q=sy-s;q<=sy+s;++q){
					li += 2*ask(sx-s-1,q);
					jin += 2*ask(sx+s,q);
				}
			}
			else if(temp==1){//上边
				for(int q=sx-s;q<=sx+s;++q){
					jin += 2*ask(q,sy+s);
					li += 2*ask(q,sy-s-1);
				}
			}
			else if(temp==3){//下边
				for(int q=sx-s;q<=sx+s;++q){
					jin += 2*ask(q,sy-s);
					li += 2*ask(q,sy+s+1);
				}
			}
		}
		printf("%d %d\n",jin,li);
	}
	return 0;
}

编程|50分] 手写数字识别
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 32768K,其他语言 65536K
64bit IO Format: %lld<
本题可使用本地IDE编码,不做跳出限制,编码后请点击“保存并调试”按钮进行代码提交。

在这个题目中,输入数据是从MNIST数据集的测试数据集中随机采样的50张28*28大小的手写数字图片,请实现程序识别这个手写数字并输出一个字符表示识别的数字
参考资料:MNIST数据集 h

注意,本题一共50个测试用例,正确25个以上按比例得分,25个以下0分。由于系统计分规则限制,提交时得分显示会不准确,结束以后会由人工审核定分。
输入描述:
每组测试用例一行,包括28*28个整数,每个整数范围0-255,代表对应像素的灰度值,像素排列顺序与原始mnist数据集一致
输出描述:
对于每组测试用例输入数据,输出一行包含一个整数,表示识别的手写数字
示例1

  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0  84 185 159 151  60  36   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0 222 254 254 254 254 241 198 198 198 198 198 198 198 198 170  52   0   0   0   0   0   0
  0   0   0   0   0   0  67 114  72 114 163 227 254 225 254 254 254 250 229 254 254 140   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0  17  66  14  67  67  67  59  21 236 254 106   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  83 253 209  18   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  22 233 255  83   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 129 254 238  44   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  59 249 254  62   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 133 254 187   5   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9 205 248  58   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 126 254 182   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0  75 251 240  57   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0  19 221 254 166   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   3 203 254 219  35   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0  38 254 254  77   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0  31 224 254 115   1   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0 133 254 254  52   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0  61 242 254 254  52   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0 121 254 254 219  40   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0 121 254 207  18   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

OUTPUT:7

没做过这种题。。题解待更新
更新一下
通过下载数据集 我们可以得到很多的手写数字的数据集,我挑选了前100个作为已知的数据 通过和输入的数据做对比,得到最准确的那个
对比的公式为
sum = sqrt( Σ(a[i]-b[i])*(a[i]-b[i]) )
看一下这个链接学习这种简单的识别算法
https://www.zhihu.com/question/29238666

import numpy as np
import struct
import matplotlib.pyplot as plt

# 训练集文件
train_images_idx3_ubyte_file = 'MNIST_data/train-images.idx3-ubyte'
# 训练集标签文件
train_labels_idx1_ubyte_file = 'MNIST_data/train-labels.idx1-ubyte'

# 测试集文件
test_images_idx3_ubyte_file = 'MNIST_data/t10k-images.idx3-ubyte'
# 测试集标签文件
test_labels_idx1_ubyte_file = 'MNIST_data/t10k-labels.idx1-ubyte'


def decode_idx3_ubyte(idx3_ubyte_file):
    """
    解析idx3文件的通用函数
    :param idx3_ubyte_file: idx3文件路径
    :return: 数据集
    """
    # 读取二进制数据
    bin_data = open(idx3_ubyte_file, 'rb').read()

    # 解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽
    offset = 0
    fmt_header = '>iiii' #因为数据结构中前4行的数据类型都是32位整型,所以采用i格式,但我们需要读取前4行数据,所以需要4个i。我们后面会看到标签集中,只使用2个ii。
    magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, bin_data, offset)
    print('魔数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))

    # 解析数据集
    image_size = num_rows * num_cols
    offset += struct.calcsize(fmt_header)  #获得数据在缓存中的指针位置,从前面介绍的数据结构可以看出,读取了前4行之后,指针位置(即偏移位置offset)指向0016。
    print(offset)
    fmt_image = '>' + str(image_size) + 'B'  #图像数据像素值的类型为unsigned char型,对应的format格式为B。这里还有加上图像大小784,是为了读取784个B格式数据,如果没有则只会读取一个值(即一副图像中的一个像素值)
    print(fmt_image,offset,struct.calcsize(fmt_image))
    images = np.empty((num_images, num_rows, num_cols))
    #plt.figure()
    for i in range(num_images):
        if (i + 1) % 10000 == 0:
            print('已解析 %d' % (i + 1) + '张')
            print(offset)
        images[i] = np.array(struct.unpack_from(fmt_image, bin_data, offset)).reshape((num_rows, num_cols))
        #print(images[i])
        offset += struct.calcsize(fmt_image)
#        plt.imshow(images[i],'gray')
#        plt.pause(0.00001)
#        plt.show()
    #plt.show()

    return images


def decode_idx1_ubyte(idx1_ubyte_file):
    """
    解析idx1文件的通用函数
    :param idx1_ubyte_file: idx1文件路径
    :return: 数据集
    """
    # 读取二进制数据
    bin_data = open(idx1_ubyte_file, 'rb').read()

    # 解析文件头信息,依次为魔数和标签数
    offset = 0
    fmt_header = '>ii'
    magic_number, num_images = struct.unpack_from(fmt_header, bin_data, offset)
    print('魔数:%d, 图片数量: %d张' % (magic_number, num_images))

    # 解析数据集
    offset += struct.calcsize(fmt_header)
    fmt_image = '>B'
    labels = np.empty(num_images)
    for i in range(num_images):
        if (i + 1) % 10000 == 0:
            print ('已解析 %d' % (i + 1) + '张')
        labels[i] = struct.unpack_from(fmt_image, bin_data, offset)[0]
        offset += struct.calcsize(fmt_image)
    return labels


def load_train_images(idx_ubyte_file=train_images_idx3_ubyte_file):
    """
    TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000803(2051) magic number
    0004     32 bit integer  60000            number of images
    0008     32 bit integer  28               number of rows
    0012     32 bit integer  28               number of columns
    0016     unsigned byte   ??               pixel
    0017     unsigned byte   ??               pixel
    ........
    xxxx     unsigned byte   ??               pixel
    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

    :param idx_ubyte_file: idx文件路径
    :return: n*row*col维np.array对象,n为图片数量
    """
    return decode_idx3_ubyte(idx_ubyte_file)


def load_train_labels(idx_ubyte_file=train_labels_idx1_ubyte_file):
    """
    TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000801(2049) magic number (MSB first)
    0004     32 bit integer  60000            number of items
    0008     unsigned byte   ??               label
    0009     unsigned byte   ??               label
    ........
    xxxx     unsigned byte   ??               label
    The labels values are 0 to 9.

    :param idx_ubyte_file: idx文件路径
    :return: n*1维np.array对象,n为图片数量
    """
    return decode_idx1_ubyte(idx_ubyte_file)


def load_test_images(idx_ubyte_file=test_images_idx3_ubyte_file):
    """
    TEST SET IMAGE FILE (t10k-images-idx3-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000803(2051) magic number
    0004     32 bit integer  10000            number of images
    0008     32 bit integer  28               number of rows
    0012     32 bit integer  28               number of columns
    0016     unsigned byte   ??               pixel
    0017     unsigned byte   ??               pixel
    ........
    xxxx     unsigned byte   ??               pixel
    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

    :param idx_ubyte_file: idx文件路径
    :return: n*row*col维np.array对象,n为图片数量
    """
    return decode_idx3_ubyte(idx_ubyte_file)


def load_test_labels(idx_ubyte_file=test_labels_idx1_ubyte_file):
    """
    TEST SET LABEL FILE (t10k-labels-idx1-ubyte):
    [offset] [type]          [value]          [description]
    0000     32 bit integer  0x00000801(2049) magic number (MSB first)
    0004     32 bit integer  10000            number of items
    0008     unsigned byte   ??               label
    0009     unsigned byte   ??               label
    ........
    xxxx     unsigned byte   ??               label
    The labels values are 0 to 9.

    :param idx_ubyte_file: idx文件路径
    :return: n*1维np.array对象,n为图片数量
    """
    return decode_idx1_ubyte(idx_ubyte_file)



if __name__ == '__main__':
    train_images = load_train_images()

    train_labels = load_train_labels()
    # test_images = load_test_images()
    # test_labels = load_test_labels()
    ans = []

    # 查看前十个数据及其标签以读取是否正确
    # 
    lb = []
    x = []
    for i in range(100):
        # print(int(train_labels[i]))
        lb.append(int(train_labels[i]))
        # plt.imshow(train_images[i], cmap='gray')
        
        for q in train_images[i]:
            for s in q:
                x.append(str(int(s)))
        # print (train_images[i])
        # plt.pause(0.000001)
        # plt.show()
    with open("1.txt","w") as f:
        print(','.join(x),file=f)
        print(lb,file=f)
    print('done')
    

代码数据集太大不放博客了。。。。csdn奔溃好几次蛤蛤蛤蛤蛤
https://paste.ubuntu.com/p/TKQxqkQy2j/

你可能感兴趣的:(面试算法题)