top1编程
← 返回题目
题解

格子游戏

1 条题解

  • 0
    @ 2026-7-29 0:19:42
    #include <iostream>
    #include <vector>
    #include <queue>
    #include <unordered_map>
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	
    	int n;
    	if (!(cin >> n)) return 0;
    	vector<int> a(n);
    	for (int i = 0; i < n; ++i) cin >> a[i];
    	
    	// next[i] = i 鍙充晶绗竴涓笌 a[i] 浜害鐩稿悓鐨勪綅缃紱涓嶅瓨鍦ㄥ垯涓?-1
    	vector<int> next(n, -1);
    	unordered_map<int, int> last; // 璁板綍姣忕浜害鏈€杩戯紙鏈€鍙筹級鐨勫嚭鐜颁綅缃?
    	last.reserve(n * 2);
    	
    	for (int i = n - 1; i >= 0; --i) {
    		if (last.count(a[i])) next[i] = last[a[i]];
    		last[a[i]] = i;
    	}
    	
    	// BFS
    	vector<int> dist(n, -1);
    	queue<int> q;
    	dist[0] = 0;
    	q.push(0);
    	
    	while (!q.empty()) {
    		int u = q.front();
    		q.pop();
    		if (u == n - 1) break;
    		
    		int d = dist[u];
    		
    		// 鍚戝乏
    		if (u - 1 >= 0 && dist[u - 1] == -1) {
    			dist[u - 1] = d + 1;
    			q.push(u - 1);
    		}
    		// 鍚戝彸
    		if (u + 1 < n && dist[u + 1] == -1) {
    			dist[u + 1] = d + 1;
    			q.push(u + 1);
    		}
    		// 鐬Щ
    		if (next[u] != -1 && dist[next[u]] == -1) {
    			dist[next[u]] = d + 1;
    			q.push(next[u]);
    		}
    	}
    	
    	cout << dist[n - 1] << '&#92;n';
    	return 0;
    }
    
    • 1