2 条题解

  • 0
    @ 2025-8-5 17:17:09
    • 为什么会 wa 呢
    • 试一试这组数据
    2 3 2
    1 1 2 3
    ..@
    ...
    
    • 答案应该是 2
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	
    	int n, m, k, x1, y1, x2, y2;
    	cin >> n >> m >> k >> x1 >> y1 >> x2 >> y2;
    	x1--, y1--, x2--, y2--;
    	vector<string> g(n);
    	for (int i = 0; i < n; i++) cin >> g[i];
    	
    	vector<int> dx = {0, 1, 0, -1};
    	vector<int> dy = {1, 0, -1, 0};
    	vector<vector<int>> d(n, vector<int>(m, -1));
    	queue<pair<int, int> > q;
    	q.push({x1, y1}), d[x1][y1] = 0;
    	while (!q.empty()) {
    		auto [x, y] = q.front();
    		q.pop();
    		
    		// 先枚举方向,再枚举长度
    		for (int j = 0; j < 4; j++) {
    			for (int p = 1; p <= k; p++) {
    				int u = x + p * dx[j], v = y + p * dy[j];
    				
    				// d[u][v] != -1 就直接 break
    				if (u < 0 || u >= n || v < 0 || v >= m || g[u][v] == '@' || d[u][v] != -1) break;
    				d[u][v] = d[x][y] + 1;
    				q.push({u, v});
    			}
    		}
    	}
    	cout << d[x2][y2] << '\n';
    	
    	return 0;
    }
    
    
    • 0
      @ 2025-8-5 17:15:24
      • 为什么会 TLE 呢
      • 迷宫大小 h×wh \times w 最大是 10610^6
      • 每次的最大步长 kk,最大也是 10610^6
      #include <bits/stdc++.h>
      using namespace std;
      
      int main() {
      	ios::sync_with_stdio(false);
      	cin.tie(nullptr); cout.tie(nullptr);
      	
      	int n, m, k, x1, y1, x2, y2;
      	cin >> n >> m >> k >> x1 >> y1 >> x2 >> y2;
      	x1--, y1--, x2--, y2--;
      	vector<string> g(n);
      	for (int i = 0; i < n; i++) cin >> g[i];
      	
      	vector<int> dx = {0, 1, 0, -1};
      	vector<int> dy = {1, 0, -1, 0};
      	vector<vector<int>> d(n, vector<int>(m, -1));
      	queue<pair<int, int>>  q;
      	q.push({x1, y1}), d[x1][y1] = 0;
      	while (!q.empty()) {
      		auto [x, y] = q.front();
      		q.pop();
      		
      		// 先枚举方向,再枚举长度
      		for (int j = 0; j < 4; j++) {
      			for (int p = 1; p <= k; p++) {
      				int u = x + p * dx[j], v = y + p * dy[j];
      				if (u < 0 || u >= n || v < 0 || v >= m || g[u][v] == '@') break;
      				if (d[u][v] == -1) {
      					d[u][v] = d[x][y] + 1;
      					q.push({u, v});
      				}
      			}
      		}
      	}
      	cout << d[x2][y2] << '\n';
      	
      	return 0;
      }
      
      • 1

      信息

      ID
      54
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      125
      已通过
      20
      上传者