社区讨论

BFS题,Atcoder上提交AC41WA16个,已写注释

AT_abc387_d [ABC387D] Snaky Walk参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@m5z7b9qf
此快照首次捕获于
2025/01/16 18:42
去年
此快照最后确认于
2025/11/04 11:30
4 个月前
查看原帖
找bug至少一小时了,看别人的题解和代码怎么都找不出问题,样例都对,希望大佬能出手帮忙!
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
struct node
{
	int x, y, d, step;//d 为1则这步垂直 为2则这步水平    step为步数
};
char arr[N][N];
int vis[N][N];
queue<node>q;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
signed main()
{
	int n, m;
	cin >> n >> m; 
	int bi, bj, ei, ej;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			cin >> arr[i][j];
			if (arr[i][j] == 'S')bi = i, bj = j;//记录开始坐标
			if (arr[i][j] == 'G')ei = i, ej = j;//记录目标坐标
		}
	
	q.push({bi,bj,1,0});//1垂直
	q.push({bi,bj,2,0});//2水平
	vis[bi][bj] = 1;
	while (!q.empty())
	{
		auto t = q.front();//t为目前位置
		q.pop();
		if (t.x == ei && t.y == ej)//如果到了目标位置
		{
			cout << t.step; return 0;
		}
		for (int i = 0; i < 4; i++)//i 0右 1下 2左 3上
		{
			if (t.d == 1 && (i == 1 || i == 3))continue;//如果上步为1垂直,则下一步不能走 下和上
			if (t.d == 2 && (i == 0 || i == 2))continue;//如果上步为2水平,则下一步不能走 左和右

				int a = t.x + dx[i], b = t.y + dy[i];//下一步的坐标 a为x坐标 b为y坐标
				if (a <= 0 || a > n || b <= 0 || b > m)continue;//越界
				if (vis[a][b])continue;//走过
				if (arr[a][b] =='#')continue;//有障碍物

				vis[a][b] = 1;
				if(i==1||i==3)//记录此步为垂直 
				q.push({ a,b,1,t.step+1});//步数+1
				if (i == 0 || i == 2)//记录此步为水平 
					q.push({ a,b,2,t.step + 1 });//步数+1
			}
	}
		cout << -1;
	return 0;
}

回复

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

正在加载回复...