在网络游戏中,可见关系计算是一个非常重要的模块。有大量的功能关心一个玩家进入了另外一个玩家的视野,或者一个玩家离开了另外一个玩家的视野。
在这个题目里,我们简化了一下模型:
现在,在给定的情况下,需要你帮忙计算一下,每一秒产生的进入视野事件和离开视野事件的数量。
需要注意的是,同一秒里玩家的移动也是有先后顺序的,所以可能产生在同一秒里A移动一步离开了B的视野,然后B又移动一步重新进入了A的视野。
输入描述:
每个测试输入包含1个测试用例
第一行为6个整数W,H,N,S,T,R0。含义见题目描述,范围: 0
输出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
但仔细一想我们发现每次每个人移动,带来的格子变化有多少呢?两排。
希望代码可以看懂~
#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/