疑似出现了死循环,但是不知道哪有问题。#78TLE 求hack!
查看原帖
疑似出现了死循环,但是不知道哪有问题。#78TLE 求hack!
1139581
Wi1l_楼主2024/3/4 19:56
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define INF 0x3f3f3f3f3f3f3f3f
#define MOD 1000000007
using namespace std;
//双端队列01bfs
//从左上角走到右下角
vector<ll>rows[1005];//记录第i行所有柱子的列数 用于遍历水平方向
vector<ll>columns[1005];//记录第i列所有主子的行数 用于遍历竖直方向
bool vis[1005][1005]; //确认柱子是否被遍历过
struct point{
	ll x;
	ll y;
	ll step;
	bool way;
};
void solve(){
	deque<point>de;
	ll n,m;	bool flag=0;
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		for(ll j=1;j<=m;j++){
			char t;
			cin>>t;
			if(t=='#') {rows[i].push_back(j);columns[j].push_back(i);if(i==1&&j==1)flag=1;}//记录柱子的行数 列数
		}
	}
	ll ans=INF;
	vis[1][1]=1;
	if(flag) de.push_back({1,1,1,0});//如果第一行第一列有柱子,从这个柱子竖直方向遍历也加入队列
	de.push_front({1,1,0,1});//起点
	while(!de.empty()){
		point tem=de.front();
		de.pop_front();
		vis[tem.x][tem.y]=1;
		if(tem.x==n){//如果遍历到了最后一行的柱子,即到达终点,根据方向确定代价
			if(tem.way) ans=min(ans,tem.step);
			else ans=min(ans,tem.step+1);
		}
		if(tem.way){//如果是水平方向遍历
			for(ll i=0;i<rows[tem.x].size();i++){
				if(vis[tem.x][rows[tem.x][i]]) continue;//如果遍历过 跳过
				if(rows[tem.x][i]==tem.y) continue;//如果是当前柱子 跳过 继续遍历其他柱子
				vis[tem.x][rows[tem.x][i]]=1;//设为遍历过
				de.push_front({tem.x,rows[tem.x][i],tem.step,tem.way});//如果与当前方向相同即为0 加在队列前端
				de.push_back({tem.x,rows[tem.x][i],tem.step+1,!tem.way});//如果与当前方向不同即为1 加载队列后端
			}
		}else{//如果是竖直方向遍历
			for(ll i=0;i<columns[tem.y].size();i++){
				if(vis[columns[tem.y][i]][tem.y]) continue;//如果遍历过 跳过
				if(columns[tem.y][i]==tem.x) continue;//如果是当前柱子 跳过 继续遍历其他柱子
				vis[columns[tem.y][i]][tem.y]=1;//设为遍历过
				
				de.push_front({columns[tem.y][i],tem.y,tem.step,tem.way});//如果与当前方向相同即为0 加在队列前端
				de.push_back({columns[tem.y][i],tem.y,tem.step+1,!tem.way});//如果与当前方向不同即为1 加在队列后端
			}
		}
	}
	if(ans==INF) cout<<-1<<endl;
	else
	std::cout<<ans<<endl;
}
int main(){
	ios::sync_with_stdio(0);
	std::cin.tie(0);std::cout.tie(0);
	ll t=1;
	while(t--) solve();
	return 0;
}
2024/3/4 19:56
加载中...