dijkstra80求调
查看原帖
dijkstra80求调
1272259
cgxd楼主2024/9/8 09:44
#include<bits/stdc++.h>
using namespace std;
int n;
vector<pair<int, int>> dir[68];
void init(){
	dir['A'].push_back(pair<int, int>(1, 0));
	dir['A'].push_back(pair<int, int>(0, 1));
	dir['A'].push_back(pair<int, int>(-1, 0));
	dir['A'].push_back(pair<int, int>(0, -1));
	dir['B'].push_back(pair<int, int>(2, 0));
	dir['B'].push_back(pair<int, int>(0, 2));
	dir['B'].push_back(pair<int, int>(-2, 0));
	dir['B'].push_back(pair<int, int>(0, -2));
	dir['C'].push_back(pair<int, int>(1, 1));
	dir['C'].push_back(pair<int, int>(1, -1));
	dir['C'].push_back(pair<int, int>(-1, 1));
	dir['C'].push_back(pair<int, int>(-1, -1));	
}vector<string> v(1);
bitset<1205> vis[1205];
set<tuple<int, int, int>> s;
void dijkstra(){
	while(s.size()){
		tuple<int, int, int> t = *s.begin();
		s.erase(s.begin());
		int x = get<1>(t), y = get<2>(t), st = get<0>(t);
		for(pair<int, int> p: dir[v[x][y]]){
			int x1 = x + get<0>(p), y1 = y + get<1>(p);
			if(x1 < 1 or x1 > n or y1 < 1 or y1 > n or vis[x1][y1]) continue;
			vis[x1][y1] = 1;
			if(x1 == n and y1 == n){
				cout << st + 1 + (v[x][y] == 'C');
				exit(0);
			}s.insert(tuple<int, int, int>(st + 1 + (v[x][y] == 'C'), x1, y1));
		}
	}
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	init();
	s.insert(tuple<int, int, int>(1, 1, 1));
	s.insert(tuple<int, int, int>(1, 1, n));
	s.insert(tuple<int, int, int>(1, n, 1));
	for(int i = 1; i <= n; ++i){
		string s(1, ' ');
		for(int j = 1; j <= n; ++j){
			char c;
			cin >> c;
			s.push_back(c);
			vis[i][j] = (c == '*');
		}v.push_back(s);
	}dijkstra();
	cout << "No answer";
	return 0;
}
2024/9/8 09:44
加载中...