zoukankan      html  css  js  c++  java
  • hihocoder 网易游戏2016实习生招聘在线笔试 解题报告

    比赛笔试链接:http://hihocoder.com/contest/ntest2015april/problems

    题目就不贴了。

    1、推箱子。

    思路:纯模拟。

    代码(28MS):

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int MAXV = 10010;
     5 
     6 const char str_op[] = "dulr";
     7 int fx[] = {1, -1, 0, 0};
     8 int fy[] = {0, 0, -1, 1};
     9 
    10 inline int id(char c) {
    11     static const char op[] = "dulr";
    12     return strchr(op, c) - op;
    13 }
    14 
    15 char op[MAXV];
    16 int len;
    17 char mat[105][105];
    18 int n, m, s;
    19 
    20 int sx, sy, vx, vy, ex, ey;
    21 
    22 void init() {
    23     for(int i = 1; i <= n; ++i)
    24         for(int j = 1; j <= m; ++j) {
    25             if(mat[i][j] == '1') sx = i, sy = j;
    26             if(mat[i][j] == '2') ex = i, ey = j;
    27             if(mat[i][j] == '3') vx = i, vy = j;
    28         }
    29 }
    30 
    31 bool solve() {
    32     int x1 = sx, y1 = sy, x2 = vx, y2 = vy;
    33     for(int i = 0; i < len; ++i) {
    34         int f = id(op[i]);
    35         int new_x = x1 + fx[f], new_y = y1 + fy[f];
    36         if(new_x == x2 && new_y == y2) {
    37             int pp = x2 + fx[f], qq = y2 + fy[f];
    38             if(mat[pp][qq] != '4') {
    39                 x1 = new_x, y1 = new_y;
    40                 x2 = pp,    y2 = qq;
    41             }
    42         } else if(mat[new_x][new_y] != '4') {
    43             x1 = new_x, y1 = new_y;
    44         }
    45         if(x2 == ex && y2 == ey) return true;
    46     }
    47     return false;
    48 }
    49 
    50 int main() {
    51     memset(mat, '4', sizeof(mat));
    52     scanf("%d%d%d", &m, &n, &s);
    53     for(int i = 1; i <= n; ++i)
    54         for(int j = 1; j <= m; ++j) scanf(" %c", &mat[i][j]);
    55     init();
    56     while(s--) {
    57         scanf("%d %s", &len, op);
    58         puts(solve() ? "YES" : "NO");
    59     }
    60 }
    View Code

    2、井字棋

    思路:俗称井字过三关。题目没有提到的三种不合法情况:

    ①XO都有3连

    ②X有3连,但是count(X)=count(O)

    ③O有3连,但是count(X)-1=count(O) 

    其他不难。人工手动枚举大法好。简单粗暴不易出错。

    不过我又成功在通过样例之前把代码交了上去导致WA20(不算罚时就是好啊)

    代码(15MS):

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 using namespace std;
     6 typedef long long LL;
     7 
     8 int f[8][3] = {
     9 {0, 1, 2},
    10 {3, 4, 5},
    11 {6, 7, 8},
    12 {0, 3, 6},
    13 {1, 4, 7},
    14 {2, 5, 8},
    15 {0, 4, 8},
    16 {2, 4, 6}
    17 };
    18 
    19 char mat[10];
    20 int wino[8], winx[8];
    21 int T;
    22 
    23 void build_check(int win[], char c) {
    24     for(int i = 0; i < 8; ++i) {
    25         win[i] = 1;
    26         for(int j = 0; j < 3; ++j)
    27             if(mat[f[i][j]] != c) win[i] = 0;
    28     }
    29 }
    30 
    31 int build_count(char c) {
    32     return count(mat, mat + 9, c);
    33 }
    34 
    35 bool next_win(char c) {
    36     int win[8];
    37     for(int i = 0; i < 9; ++i) if(mat[i] == '_') {
    38         mat[i] = c;
    39         build_check(win, c);
    40         if(count(win, win + 8, 1)) return true;
    41         mat[i] = '_';
    42     }
    43     return false;
    44 }
    45 
    46 int solve() {
    47     int xcnt = build_count('X'), ocnt = build_count('O');
    48     if(xcnt != ocnt && xcnt - 1 != ocnt) return puts("Invalid");
    49 
    50     build_check(winx, 'X');
    51     build_check(wino, 'O');
    52     if(count(winx, winx + 8, 1) > 0 && count(wino, wino + 8, 1) > 0) return puts("Invalid");
    53     if(count(winx, winx + 8, 1) > 0 && xcnt == ocnt) return puts("Invalid");
    54     if(count(wino, wino + 8, 1) > 0 && xcnt - 1 == ocnt) return puts("Invalid");
    55 
    56     if(count(winx, winx + 8, 1) > 0) return puts("X win");
    57     if(count(wino, wino + 8, 1) > 0) return puts("O win");
    58 
    59     if(build_count('_') == 0) return puts("Draw");
    60 
    61     if(next_win(xcnt == ocnt ? 'X' : 'O')) return puts("Next win");
    62     return puts("Next cannot win");
    63 }
    64 
    65 int main() {
    66     scanf("%d", &T);
    67     while(T--) {
    68         scanf("%s", mat);
    69         scanf("%s", mat + 3);
    70         scanf("%s", mat + 6);
    71         solve();
    72     }
    73 }
    View Code

    3、连连看

    思路:参照最小转弯问题:http://www.cnblogs.com/oyking/p/3756208.html

    估计直接来个heap+dijkstra也能100分把。

    代码(302MS):

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <queue>
     6 using namespace std;
     7 
     8 const int MAXN = 210;
     9 const int INF = 0x3f3f3f3f;
    10 
    11 struct Node {
    12     int f, x, y;
    13     Node() {}
    14     Node(int f, int x, int y):
    15         f(f), x(x), y(y) {}
    16 };
    17 
    18 int fx[] = {-1, 0, 1, 0};
    19 int fy[] = {0, 1, 0, -1};
    20 
    21 int dis[4][MAXN][MAXN];
    22 int mat[MAXN][MAXN];
    23 bool vis[MAXN][MAXN];
    24 int T, n, m;
    25 
    26 int bfs(int x1, int y1, int k) {
    27     memset(vis, 0, sizeof(vis)); vis[x1][y1] = true;
    28     memset(dis, 0x3f, sizeof(dis));
    29     queue<Node> *now = new queue<Node>();
    30     queue<Node> *nxt = new queue<Node>();
    31     int step = 0, res = 0;
    32     for(int i = 0; i < 4; ++i) now->push(Node(i, x1, y1));
    33     for(int i = 0; i < 4; ++i) dis[i][x1][y1] = 0;
    34     while(step <= k && !now->empty()) {
    35         Node t = now->front(); now->pop();
    36         if(dis[t.f][t.x][t.y] != step) continue;
    37         for(int i = 0; i < 4; ++i) {
    38             if((t.f + 2) % 4 == i) continue;
    39             int x = t.x + fx[i], y = t.y + fy[i], d = dis[t.f][t.x][t.y] + (t.f != i);
    40             if(mat[x][y] == mat[x1][y1] && !vis[x][y] && d <= k) {
    41                 vis[x][y] = true;
    42                 res++;
    43             }
    44             if(mat[x][y] == 0 && d < dis[i][x][y]) {
    45                 dis[i][x][y] = d;
    46                 if(t.f == i) now->push(Node(i, x, y));
    47                 else nxt->push(Node(i, x, y));
    48             }
    49         }
    50         if(now->empty()) {
    51             step++;
    52             swap(now, nxt);
    53         }
    54     }
    55     return res;
    56 }
    57 
    58 int main() {
    59     scanf("%d", &T);
    60     while(T--) {
    61         scanf("%d%d", &n, &m);
    62         memset(mat, 0x3f, sizeof(mat));
    63         for(int i = 2; i <= n + 1; ++i)
    64             for(int j = 2; j <= m + 1; ++j) scanf("%d", &mat[i][j]);
    65         for(int i = 1; i <= n + 2; ++i)
    66             for(int j = 1; j <= m + 2; ++j)
    67                 if(mat[i][j] == INF) mat[i][j] = 0;
    68 
    69         int x, y, k;
    70         scanf("%d%d%d", &x, &y, &k);
    71         printf("%d
    ", bfs(x + 1, y + 1, k));
    72     }
    73 }
    View Code
  • 相关阅读:
    discuz登录流程解析(版本X3.2)
    利用AngularJs实现京东首页轮播图效果
    CC攻击原理及防范方法
    Session优缺点
    jQuery EasyUI教程之datagrid应用
    XSS攻击的解决方法
    DIV+CSS 命名规范
    30个你必须记住的CSS选择符
    导出虚拟机的OVF 模板
    k8s 常用命令
  • 原文地址:https://www.cnblogs.com/oyking/p/4404653.html
Copyright © 2011-2022 走看看