京东笔试消消乐
京东笔试第一题分享:
由于方格比较小,就采用暴力破解的方法,注意一下中间变量的保存就行了,方法比较笨,minNum初始化为格子大小25(最多)
//first problem void show(int **graph) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cout << graph[i][j] << "*"; } cout << endl; } cout << "*********" << endl; return; } vector<pair<int,int>> cluster(int **graph, int N=5,int M=5) { vector<pair<int,int>> ret; // show(graph); vector<pair<int,int>> point; int x, y; pair<int,int> temp; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (graph[i][j] != -1) { temp.first = i; temp.second = j; int count = 1; int index = graph[i][j]; graph[i][j] = -1; point.clear(); point.push_back(temp); int xx = i; int yy = j; while (point.size() > 0) { temp = point.back(); point.pop_back(); x = temp.first; y = temp.second; if (x > 0 && graph[x - 1][y] == index) { graph[x - 1][y] = -1; count++; point.push_back({x - 1, y}); } // cout<<x<<"*"<<graph[4][2]<<endl; if (x < N-1 && graph[x + 1][y] == index) { graph[x + 1][y] = -1; count++; point.push_back({x + 1, y}); } if (y > 0 && graph[x][y - 1] == index) { graph[x][y - 1] = -1; count++; point.push_back({x, y - 1}); } if (y < M-1 && graph[x][y + 1] == index) { graph[x][y + 1] = -1; count++; point.push_back({x, y + 1}); } } if (count > 2) { ret.push_back(temp); } } } } return ret; } void label(int **graph, pair<int,int> position,int N=5,int M=5) { vector<pair<int,int>> point; pair<int,int>temp; point.push_back(position); int index = graph[position.first][position.second]; int x, y; // cout << position[0] << "*" << position[1] << "*" << index << endl; while (point.size() > 0) { temp = point.back(); point.pop_back(); x = temp.first; y = temp.second; graph[x][y] = -1; if (x > 0 && graph[x - 1][y] == index) { graph[x - 1][y] = -1; point.push_back({x - 1, y}); } if (x < N-1 && graph[x + 1][y] == index) { graph[x + 1][y] = -1; point.push_back({x + 1, y}); } if (y > 0 && graph[x][y - 1] == index) { graph[x][y - 1] = -1; point.push_back({x, y - 1}); } if (y < M-1 && graph[x][y + 1] == index) { graph[x][y + 1] = -1; point.push_back({x, y + 1}); } } return; } void fall(int **&graph,int N=5,int M=5) { for (int i = N-2; i >= 0; i--) { for (int j = 0; j < M; j++) { if (graph[i][j] != -1 && graph[i + 1][j] == -1) { int k = i; while (k < N-1 && graph[k + 1][j] == -1) k++; graph[k][j] = graph[i][j]; graph[i][j] = -1; } } } return; } int count(int **graph,int N=5,int M=5) { // show(graph); int ret = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (graph[i][j] != -1) ret++; } } return ret; } void entertainment(int **graph, int &minNum, int N=5,int M=5) { // show(graph); int **dataArray = (int **)malloc(sizeof(int *)*N); for (int i = 0; i < N; i++) dataArray[i] = new int[5]; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { dataArray[i][j] = graph[i][j]; } } vector<pair<int,int>> ret = cluster(dataArray,N,M); if (ret.size() == 0) { int temp = count(graph,N,M); if (temp < minNum) minNum = temp; return; } for (int i = 0; i < ret.size(); i++) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { dataArray[i][j] = graph[i][j]; } } pair<int,int> position = ret[i]; // show(dataArray); label(dataArray, position,N,M); // show(dataArray); fall(dataArray,N,M); // show(dataArray); // cout<<position[0]<<position[1]<<graph[position[0]][position[1]]<<endl; entertainment(dataArray, minNum,N,M); } return; }第二题,迷宫求解:
讲输入当成一个格子,复制一个3*3的格子,再用dfs判断有没有路径到边缘即可.
bool findPath(vector<string >& grid, vector<vector<bool > >& vis, int y, int x) { if (y == -1 || y == grid.size() || x == -1 || x == grid[0].size()) return true; if (vis[y][x] || grid[y][x] == '#') return false; vis[y][x] = true; if (findPath(grid, vis, y - 1, x) || findPath(grid, vis, y + 1, x) || findPath(grid, vis, y , x - 1) || findPath(grid, vis, y, x+1)) return true; return false; } int girdPath() { int t; cin >> t; for (int k = 0; k < t; k++) { int m, n; cin >> m >> n; vector<string > grid(m); for (int i = 0; i < m; i++) cin >> grid[i]; // copy 3*3 vector<string > bigGrid(3 * m); for (int i = 0; i < m; i++) { bigGrid[i] = grid[i] + grid[i] + grid[i]; bigGrid[m + i] = bigGrid[i]; bigGrid[2*m + i] = bigGrid[i]; } // find start point int i, j; bool find = false; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (grid[i][j] == 'S') { find = true; break; } } if (find) break; } // find path vector<vector<bool>> vis(3 * m); for (int i = 0; i < 3 * m; i++) vis[i] = vector<bool >(3 * n, false); if (findPath(bigGrid, vis, m + i, n + j)) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }