zoukankan      html  css  js  c++  java
  • 2018.05.11阿里巴巴暑期实习笔试-机器学习算法岗位

    填空题很活,也很难,很考验人的数学功底,最后一道题目是编程题,不是很难,但是我还是没在规定时间内做完,不过好在最后还是做出来了!

    题目:

    八卦阵相传是由诸葛亮创设的一种战斗队形和兵力部署,由八种阵势组成。为了方便,采用矩阵来描述一个八卦阵,它由八个单阵组成,每个单阵由多个兵力区域组成形成一种阵势,如下图所示,其中数字为一个兵力区域的士兵个数。假设单阵与单阵之间兵力区域不会相邻,且单阵中每个兵力区域至少存在一个相邻兵力区域(注:相邻是指在其左上,正上,右上,右方,右下,正下,左下,左方与其相邻),请用最快的速度计算出八个单阵中的兵力(士兵个数)的最大值和最小值。

    编译器版本: gcc 4.8.4
    请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h
    时间限制: 1S (C/C++以外的语言为: 3 S)   内存限制: 128M (C/C++以外的语言为: 640 M)
    输入:
    输入描述,例如:
    第一行输入是八阵图的行数。
    第二行输入是八阵图的列数。
    后续行输入每个区域兵力。每一行的数据中间使用空格分开,当前一行输入完成后回车输入下一行数据。
    输出:
    输出描述,例如:
    输出八个单阵中兵力最大值和最小值。
    输入范例:
    20
    20
    34  0   0   0   0   0   0   0   0   0   0   0   0   0   0   10  0   0   0   30
    0   23  10  5   5   0   0   0   5   5   5   5   5   0   0   0   30  0   40  0
    0   9   0   0   5   0   0   0   4   4   4   4   4   0   0   0   0   30  0   0
    0   8   7   7   0   5   0   0   3   3   3   3   0   0   0   0   7   0   9   0
    0   9   0   0   5   0   5   0   0   12  12  0   0   0   0   10  0   0   0   9
    0   0   0   0   5   0   0   5   0   12  12  0   0   5   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   12  12  0   0   5   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0   0   5   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0   0   5   0   0   0   0   0   0
    40  30  3   6   6   0   0   0   0   0   0   0   0   5   5   0   0   0   10  0
    0   0   20  0   0   6   6   0   0   0   0   0   0   0   5   6   5   10  10  0
    40  30  3   7   6   0   0   0   0   0   0   0   0   0   0   6   0   0   10  0
    0   0   0   0   0   0   0   17  0   0   0   0   17  0   0   6   5   7   7   0
    0   0   0   0   0   0   0   0   7   0   0   7   0   0   0   0   0   0   0   0
    0   20  0   0   7   0   0   0   0   4   4   0   0   0   0   0   10  0   0   0
    0   20  0   0   7   0   0   0   0   4   4   0   0   0   0   0   10  0   0   0
    0   20  0   0   7   0   0   0   0   4   4   0   0   0   0   0   10  0   0   0
    0   30  0   7   0   0   0   0   0   5   5   0   0   0   0   0   0   10  0   50
    0   40  7   0   0   0   0   0   0   5   5   0   0   0   0   0   0   0   50  0
    43  30  25  10  50  0   0   0   6   6   6   6   0   0   0   0   0   50  0   0
    输出范例:
    323
    116

    解答:

    这道题有点像《剑指offer》上机器人的最大移动范围,思路就是遇见不为0 的数字,就遍历它周围所有不为0 的数字并且求和,一直把该“单兵块”遍历完成

    程序:

     1 #include "stdafx.h"
     2 #include<iostream>
     3 #include <vector>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <stack>
     7 #include <unordered_map>
     8 #include <limits>
     9 using namespace std;
    10 
    11 int pathCore(vector<vector<int> >& v, vector<vector<bool> >& b, int row, int col, int rows, int cols)
    12 {
    13     int res = 0;
    14     if (row >= 0 && row < rows && col >= 0 && col < cols
    15         && b[row][col] == true)
    16     {
    17         b[row][col] = false;
    18         res = v[row][col]
    19             + pathCore(v, b, row - 1, col, rows, cols)
    20             + pathCore(v, b, row, col - 1, rows, cols)
    21             + pathCore(v, b, row + 1, col, rows, cols)
    22             + pathCore(v, b, row, col + 1, rows, cols)
    23             + pathCore(v, b, row-1, col - 1, rows, cols)
    24             + pathCore(v, b, row+1, col - 1, rows, cols)
    25             + pathCore(v, b, row-1, col + 1, rows, cols)
    26             + pathCore(v, b, row+1, col + 1, rows, cols);
    27     }
    28     return res;
    29 }
    30 int main()
    31 {
    32     int cols, rows;
    33     cin >> rows >> cols;
    34     int min = 99999;
    35     int max = -99999;
    36     vector<vector<int> >  vec(rows, vector<int>(cols, 0));
    37     vector<vector<bool> >  flag(rows, vector<bool>(cols, false));//true表示遍历过了
    38     for (int i = 0; i < rows; i++)
    39         for (int j = 0; j < cols; j++)
    40         {
    41             cin >> vec[i][j];
    42             if (vec[i][j] != 0)
    43                 flag[i][j] = true;
    44         }
    45     for (int i = 0; i < rows; i++)
    46         for (int j = 0; j < cols; j++)
    47         {
    48             //表示从某个点开始遍历个单阵的兵力
    49             int ans = pathCore(vec, flag, i, j,rows,cols);
    50             if (ans > max)
    51                 max = ans;
    52             if (ans>0 && ans < min) //这地方害苦我了,一定要注意加上ans>0,否则无法判决
    53                 min = ans;
    54         }
    55     cout << max << endl;
    56     cout << min << endl;
    57     return 0;
    58 }
  • 相关阅读:
    关于表单自动提交的问题及解决方式
    转载:JAVA实现数据库数据导入/导出到Excel(POI)
    关于使用pageoffice插件实现导出数据到excel文档中
    关于导入数据到Excel中对数据库进行去重以及对导入的Excel文件进行去重
    转载:POI操作Excel常用方法总结(2003的excel)
    spring+struts+mybatis中关于导出Excel数据
    关于idea部署项目为什么抛出####:war: Server is not connected. Deploy is not available的错误?
    POI读取所有行数和列数的数据方法
    spring+struts+mybatis中关于报错org.hibernate.exception.GenericJDBCException: Connection is read-only. Queries leading to data modification are not allowed 的产生原因及解决方案
    003---设计首页index页面
  • 原文地址:https://www.cnblogs.com/dapeng-bupt/p/9278601.html
Copyright © 2011-2022 走看看