社区讨论

ABC E 求调 / 求 hack

学术版参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo1ocpak
此快照首次捕获于
2023/10/23 00:19
2 年前
此快照最后确认于
2023/11/03 01:00
2 年前
查看原帖
Code
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int now=0,nev=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')nev=-1;c=getchar();}
	while(c>='0'&&c<='9'){now=(now<<1)+(now<<3)+(c&15);c=getchar(); }
	return now*nev;
}
void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}

int w[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
const int N = 2005;
struct Node{
	int x, y, st;
};
char c[N][N];
bool vis[N][N];
int n, m;
int e, f, g, h;

signed main()
{
	n = read(), m = read();
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++){
			cin >> c[i][j];
			if (c[i][j] == 'S') e = i, f = j;
			if (c[i][j] == 'G') g = i, h = j; 
		}
	for (int i = 1; i <= n; i ++){
		for (int j = 1; j <= m; j ++){
			if (c[i][j] != '>') continue;
			c[i][j] = '#'; 
			int k = j + 1;
			while (k <= m && c[i][k] == '.')
				c[i][k] = '#', k ++;
			j = k - 1;
		}
		for (int j = m; j; j --){
			if (c[i][j] != '<') continue;
			c[i][j] = '#';
			int k = j - 1;
			while (k && c[i][k] == '.')
				c[i][k] = '#', k --;
			j = k + 1;
		}
	}
	for (int i = 1; i <= m; i ++){
		for (int j = 1; j <= n; j ++){
			if (c[j][i] != 'v') continue;
			c[j][i] = '#'; 
			int k = j + 1;
			while (k <= n && c[k][i] == '.')
				c[k][i] = '#', k ++;
			j = k - 1;
		}
		for (int j = n; j; j --){
			if (c[j][i] != '^') continue;
			c[j][i] = '#';
			int k = j - 1;
			while (k && c[k][i] == '.')
				c[k][i] = '#', k --;
			j = k + 1;
		}
	}
	
	for (int i = 1; i <= n; i ++){
		for (int j = 1; j <= m; j ++)
			cout << c[i][j];
		puts("");
	}
	
	queue<Node> q;
	q.push({e, f, 0});
	vis[e][f] = 1;
	int ans = -1;
	while (!q.empty()){
		auto t = q.front();
		q.pop();
		if (t.x == g && t.y == h){
			ans = t.st;
			break;
		}
		for (int i = 0; i < 4; i ++){
			int nx = t.x + w[i][0];
			int ny = t.y + w[i][1];
			if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && (c[nx][ny] == '.' || c[nx][ny] == 'G')){
				vis[nx][ny] = 1;
				q.push({nx, ny, t.st + 1});
			}
		}
	}
	cout << ans;
    return 0;
}
Wrong Answer,大部分是 random 数据。

回复

3 条回复,欢迎继续交流。

正在加载回复...