# 9月1日 拼多多 笔试
9月1日 拼多多 笔试
第一题
一个 n
阶矩阵,用米字线分割为如下8个区域。
矩阵元素需要满足:
- 各区域内的元素都等于区域的编号
- 被分割线穿过的元素值都等于0
打印这个矩阵。
示例用例:
输入:4
输出:
0 2 1 0
3 0 0 8
4 0 0 7
0 5 6 0
输入:5
输出:
0 2 0 1 0
3 0 0 0 8
0 0 0 0 0
4 0 0 0 7
0 5 0 6 0
我的代码
package main import "fmt" func main() { var n int fmt.Scan(&n) matrix:=make([][]int,n) for i:=0;i<n;i++{ matrix[i]=make([]int,n) } for r:=0;r<(n+1)/2;r++{ for c:=(n+1)/2;c<n-1-r;c++{ matrix[r][c]=1 matrix[r][n-1-c]=2 matrix[n-1-c][r]=3 matrix[c][r]=4 matrix[n-1-r][n-1-c]=5 matrix[n-1-r][c]=6 matrix[c][n-1-r]=7 matrix[n-1-c][n-1-r]=8 } } for _,line:=range matrix{ for _,e:=range line{ fmt.Print(e," ") } fmt.Println() } }
第二题
N*M
的矩阵,值为 1
表示一个士兵,0
表示没有士兵。相邻(上下左右)的士兵属于同一个队伍。
你可以将任意一个士兵移动到任意一个空的位置。求移动之后得到的最大队伍的人数。
用 bfs
找出每个连续的区域,并将该区域的每个点的值标记为 idx
并记录点的数量 cnt
,将 idx
和 cnt
存进一个 map
。
接下来,我们遍历所有非零的点,对于每一个点,我们访问他的相邻点,如果相邻点非零,那么我们可以在 map
中根据他的 idx
找到该区域的点的数量。将与该点相邻的区域的点数求和得 cnt
。
如果与他相邻的区域的数量等于所有区域的数量,那么我们就从与该点相邻的区域从挪一点使得区域连通。单连通也没问题。
如果与他相邻的区域的数量小于所有区域的数量,那么我们就从其他区域从挪一点使得相邻区域连通,因此 cnt++
。
所有非零点求得的 cnt
取最大值就是结果。
示例用例:
输入:
4 4
1 0 1 1
1 1 0 1
0 0 0 0
1 1 1 1
输出:
8
输入:
3 4
0 1 0 0
1 0 1 1
0 1 0 0
输出:
5
我的代码
#include <vector> #include <iostream> #include <queue> #include <map> #include <set> using namespace std; int main() { int n,m; cin>>n>>m; vector> grid(n); for (int i=0;i<n;i++){ grid[i].resize(m); for (int j=0;j<m;j++){ cin>>grid[i][j]; } } map tps; int idx=10; int ans = 0; for (int i = 0; i != grid.size(); ++i) for (int j = 0; j != grid[0].size(); ++j) { int cur = 0; queue queuei; queue queuej; queuei.push(i); queuej.push(j); while (!queuei.empty()) { int cur_i = queuei.front(), cur_j = queuej.front(); queuei.pop(); queuej.pop(); if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1) continue; ++cur; grid[cur_i][cur_j] = idx; int di[4] = {0, 0, 1, -1}; int dj[4] = {1, -1, 0, 0}; for (int index = 0; index != 4; ++index) { int next_i = cur_i + di[index], next_j = cur_j + dj[index]; queuei.push(next_i); queuej.push(next_j); } } if (cur){ tps.emplace(idx++,cur); } } int max=0; for (int i = 0; i != grid.size(); ++i) for (int j = 0; j != grid[0].size(); ++j) { int cnt=0,total=0; if (!grid[i][j]){ set ntps; if (i+1<grid.size()&&grid[i+1][j]){ ntps.insert(grid[i+1][j]); } if (i-1>=0&&grid[i-1][j]){ ntps.insert(grid[i-1][j]); } if (j+1<grid[0].size()&&grid[i][j+1]){ ntps.insert(grid[i][j+1]); } if (j-1>=0&&grid[i][j-1]){ ntps.insert(grid[i][j-1]); } for (int i:ntps) total+=tps[i]; if (ntps.size()<tps.size()){ total++; } if (total>max){ max=total; } } } cout<<max; return 0; }#笔试题目##拼多多#