MnZn 求调代码
查看原帖
MnZn 求调代码
357163
shyr楼主2021/11/27 09:03

deque + BFS 64pts

#include<bits/stdc++.h>
using namespace std;
const int MaxN = 3e5 + 9;

int n, m, dis[MaxN], to;
std::vector<std::pair<int, int> > d[MaxN];
std::deque<int> q;
char mp[505][505];

void bfs(){
	memset(dis, 9, sizeof(dis));
	dis[1] = 0, q.push_back(1);
	while(q.size()){
		int x = q.front(); q.pop_front();
		for(int i = 0; i < d[x].size(); ++i){
			int y = d[x][i].first, val = d[x][i].second;
			if(dis[y] > dis[x] + val){
				dis[y] = dis[x] + val;
				if(!q.empty() and dis[y] <= dis[q.front()]) q.push_front(y);
				else q.push_back(y);
			}
		}
	}
	if(dis[to] == 151587081) printf("NO SOLUTION\n");
	else printf("%d\n", dis[to]);
}

int tag(int x, int y){
	return (x - 1) * (m + 1) + y;
}

signed main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i){
		scanf("%s", mp[i] + 1);
	}
	to = tag(n, m);
	for(int i = 1; i <= n; ++i){
		for(int j = 1; j <= m; ++j){
			if(mp[i][j] == '\\'){
				d[tag(i, j)].push_back(make_pair(tag(i + 1, j + 1), 0));
				d[tag(i + 1, j)].push_back(make_pair(tag(i, j + 1), 1));
				d[tag(i + 1, j + 1)].push_back(make_pair(tag(i, j), 0));
				d[tag(i, j + 1)].push_back(make_pair(tag(i + 1, j), 1));
			} 
			else{
				d[tag(i, j)].push_back(make_pair(tag(i + 1, j + 1), 1));
				d[tag(i + 1, j)].push_back(make_pair(tag(i, j + 1), 0));
				d[tag(i + 1, j + 1)].push_back(make_pair(tag(i, j), 1));
				d[tag(i, j + 1)].push_back(make_pair(tag(i + 1, j), 0));
			}
		}
	}
	bfs();
	return 0;
}

2021/11/27 09:03
加载中...