求调
查看原帖
求调
890704
jh_plus楼主2024/3/12 23:19
#include<bits/stdc++.h>
using namespace std;
int mov[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };//0上 1右 2下 3左
char OP[4] = { 'U','R','D','L' };
void solve() {
	int n, m;
	cin >> n >> m;
	vector<vector<char>> grid(n + 1, vector<char>(m + 1));
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
			cin >> grid[i][j];
	if (n == 1 && m == 1) {
		cout << 0 << endl; return;
	}
	vector<vector<char>> op(n + 1, vector<char>(m + 1, '?'));
	vector<vector<bool>> visited(n + 1, vector<bool>(m + 1, false));
	queue<pair<int, int>> que;
	que.push({ 1,1 });
	visited[1][1] = true;
	int level = 0;
	while (que.size()) {
		++level;
		int sz = que.size();
		while (sz--) {
			pair<int, int> pr = que.front(); que.pop();
			int x = pr.first, y = pr.second;
			for (int t = 0; t < 4; ++t) {
				int nx = x + mov[t][0];
				int ny = y + mov[t][1];
				if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && visited[nx][ny] == false && (grid[x][y] != grid[nx][ny])) {
					que.push({ nx,ny });
					visited[nx][ny] = true;
					op[nx][ny] = OP[t];
				}
			}
		}
		if (visited[n][m]) break;
	}
	if (visited[n][m] == false) cout << -1 << endl;
	else {
		cout << level << endl;
		stack<char> st;
		for (int i = n, j = m; i != 1 || j != 1;) {
			st.push(op[i][j]);
			if (op[i][j] == 'L') {
				j += 1;
			}
			else if (op[i][j] == 'R') {
				j -= 1;
			}
			else if (op[i][j] == 'U') {
				i += 1;
			}
			else if(op[i][j]=='D') {
				i -= 1;
			}
		}
		while(st.size()) {
			cout << st.top();
			st.pop();
		}
	}

}

int main() {
	int t;
	cin >> t;
	while (t--) solve();
	return 0;
}
2024/3/12 23:19
加载中...