【牛客】网易互娱(游戏)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;
    }
}

第三题

字符迷阵是一种经典的智力游戏。玩家需要在给定的矩形的字符迷阵中寻找特定的单词。
在这题的规则中,单词是如下规定的:

  1. 在字符迷阵中选取一个字符作为单词的开头;
  2. 选取右方、下方、或右下45度方向作为单词的延伸方向;
  3. 以开头的字符,以选定的延伸方向,把连续得到的若干字符拼接在一起,则称为一个单词。
点击查看代码
#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));
    }
}
posted @ 2022-02-12 22:34  有间猫  阅读(39)  评论(0编辑  收藏  举报