共42道题,当前是第6

初赛真题

寻路问题: $N * N$ 矩阵,其中 $0$ 是表示可以走的, $1$ 表示无法走,矩阵由二维数组表示,左上角是入口,右下角是出口,只能横着走和竖着走,要求找出最短路径。

#include<bits/stdc++.h>
using namespace std;

int mymax = 10000;
int f[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int a[20][20], v[20][20], v1[20][20];
int l = 1;
int n; //矩阵的规模
bool check(int x1, int y1) {
	if (x1 < 0 || x1 >= n || ___(1)___ ) return false;
	if (a[x1][y1] == 1 || ___(2)___ ) return false;
	return true;
}

void dfs(int x, int y) {
	if (x == n - 1 && y == n - 1) {
		if (l < mymax) {
			mymax = l;
			memcpy(v1, v, sizeof(v1));
		}
		return;
	}
	for (int k = 0; k < 4; k++) {
		int x1, y1;
		x1 = x + ___(3)___;
		y1 = y + ___(4)___;
		if (check(x1, y1)) {
			___(5)___;
			___(6)___;
			dfs(x1, y1);
			___(7)___;
			v[x1][y1] = 0;
		}
	}
}

int main() {
cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			cin >> a[i][j];
	}
	dfs(0, 0);
	int d = v1[n - 1][n - 1];
	int x = n - 1, y = n - 1;
	int k;
	int qn[400][2];
	qn[0][0] = n - 1;
	qn[0][1] = n - 1;
	for (k = 1;; k++) {
		x = x - f[d][0];
		y = y - f[d][1];
		qn[k][0] = x;
		qn[k][1] = y;
		d = v1[x][y];
		if (x == 0 && y == 0) break;
	}
	for (int i = k; i >= 0; i--)
		cout << ___(8)___ << ", " << ___(9)___ << endl;
	return 0;
}

1. D。
2. B。
3. C。
4. A。
5. A。

通过 DFS 的方式来搜索最短路并且进行路径记录,在 `DFS` 中通过数组 $v[x][y]$ 来记录到达 $(x,y)$ 这个点时是由哪个方向走过来的,这样就可以通过从终点往回不断迭代的方式来依次找到路径上的每一个点。

Question

1. (1) 和 (2) 处填( )

2. (3) 和 (4) 处填( )

3. (5) 处填( )

4. (6) 和 (7) 处填( )

5. (8) 和 (9) 处填( )

陈伦制作 版权所无 粤ICP备16127491号-1