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 }