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 }
原文地址:https://www.cnblogs.com/dapeng-bupt/p/9278601.html