HDU - 1175 连连看

#include <cstdio>
#include <cstring>

int arr[1003][1003], dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}, vis[1003][1003];
int x1, y1, x2, y2, n, m, q;

bool DFS(int change, int x, int y, int direct) {
	if (change > 3)
		return false;

	if (x == x2 && y == y2)
		return true;

	for (int i = 0; i < 4; i++) {
		if (x + dir[i][0] >= 0 && y + dir[i][1] >= 0 && x + dir[i][0] < n && y + dir[i][1] < m)
			if (!arr[x + dir[i][0]][y + dir[i][1]] && !vis[x + dir[i][0]][y + dir[i][1]] || x + dir[i][0] == x2 && y + dir[i][1]== y2) {
				vis[x + dir[i][0]][y + dir[i][1]] = 1;
				if (DFS(i == direct ? change : change + 1, x + dir[i][0], y + dir[i][1], i))
					return true;
				vis[x + dir[i][0]][y + dir[i][1]] = 0;
			}
	}
	return false;
}

int main() {
	while (scanf("%d%d", &n, &m), n) {
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				scanf("%d", &arr[i][j]);

		scanf("%d", &q);
		while (q--) {
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
			memset(vis, 0, sizeof(vis));
			printf(arr[--x1][--y1] == arr[--x2][--y2] && arr[x1][y1] && DFS(0, x1, y1, -1) ? "YES\n" : "NO\n");
		} 
	}
	return 0;
}


你可能感兴趣的:(HDU - 1175 连连看)