【牛客】网易互娱(游戏)2019年-游戏研发/初级游戏研发/
第一题
小W有一个电子时钟用于显示时间,显示的格式为HH:MM:SS,HH,MM,SS分别表示时,分,秒。其中时的范围为[‘00’,‘01’…‘23’],分的范围为[‘00’,‘01’…‘59’],秒的范围为[‘00’,‘01’…‘59’]。
但是有一天小W发现钟表似乎坏了,显示了一个不可能存在的时间“98:23:00”,小W希望改变最少的数字,使得电子时钟显示的时间为一个真实存在的时间,譬如“98:23:00”通过修改第一个’9’为’1’,即可成为一个真实存在的时间“18:23:00”。修改的方法可能有很多,小W想知道,在满足改变最少的数字的前提下,符合条件的字典序最小的时间是多少。其中字典序比较为用“HHMMSS”的6位字符串进行比较。
点击查看代码
#include<iostream>
using namespace std;
int main()
{
int t, hh, mm, ss;
cin>> t;
for (int i = 0; i < t; ++i) {
scanf("%d:%d:%d", &hh, &mm, &ss);
hh = (0 <= hh && hh <= 23) ? hh : hh % 10;
mm = (0 <= mm && mm <= 59) ? mm : mm % 10;
ss = (0 <= ss && ss <= 59) ? ss : ss % 10;
printf("%02d:%02d:%02d\n", hh, mm, ss);
}
return 0;
}
第二题
小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。
会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id表示。
当用户在一个会话中发送或接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。
点击查看代码
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--)
{
int c, i, count = 0;
cin >> c;
i = c;
int *p = new int[c];
memset(p, -1, c * 4);
while(i--)
{
int num;
cin >> num;
for(int i = 0; i < c; ++i)
{
if(p[i] == -1)
{
p[i] = num;
count++;
break;
}
if(p[i] == num)
{
int j = i;
while(j++ < count)
{
p[j - 1] = p[j];
}
p[count - 1] = num;
break;
}
}
}
for(int i = count - 1; i >= 0; --i)
{
if(p[i] == - 1)
break;
printf("%d ", p[i]);
}
cout << endl;
}
}
第三题
字符迷阵是一种经典的智力游戏。玩家需要在给定的矩形的字符迷阵中寻找特定的单词。
在这题的规则中,单词是如下规定的:
- 在字符迷阵中选取一个字符作为单词的开头;
- 选取右方、下方、或右下45度方向作为单词的延伸方向;
- 以开头的字符,以选定的延伸方向,把连续得到的若干字符拼接在一起,则称为一个单词。
点击查看代码
#include<iostream>
#include<string>
using namespace std;
const int rp[] = {1, 0, 1};
const int cp[] = {0, 1, 1};
int seach(const string * const map, const string &word, int x, int y)
{
int ans = 0;
for(int i = 0; i < y; ++i)
{
for(int j = 0; j < x; ++j) // 找首字母
{
if(map[i][j] == word[0]) // 首字母相同 尝试找完整的word
{
for(int q = 0, k; q < 3; ++q) // 3个方向找
{
if(q == 0 && y - i < word.length()
|| q == 1 && x - j < word.length()
|| q == 2 && y - i < word.length() && x - j < word.length())
continue;
int r = i, c = j;
for(k = 1; k < word.length(); ++k) // 沿着方向比较全部的word字母
{
r += rp[q];
c += cp[q];
if(r >= y || c >= x || map[r][c] != word[k]) // 如果字母不相同 break
break;
}
if(k == word.length()) // 全部查找 ans++
++ans;
}
}
}
}
return ans;
}
int main()
{
int n;
cin >> n;
while(n--)
{
int x, y;
scanf("%d %d", &y, &x);
string *map = new string[y];
string row;
for(int i = 0; i < y; ++i)
{
cin >> row;
map[i] = row;
}
string word;
cin >> word;
printf("%d\n", seach(map, word, x, y));
}
}