思路:
一开始是把用每一个起点 用bfs 得到 到达终点的距离 结果后两个样例超时了
然后就用终点为起点 去得到 终点到每一个点的距离
注意:
最气人的一点是写的都对 就有一点有问题
b[N * N]; 那就是这个b 数组的大小 是 N*N 我服了
#include<bits/stdc++.h> using namespace std; const int N = 110; int a[N][N]; int start1,en1; int n,m; int dx[4] = {0,1,0,-1},dy[4] = {1,0,-1,0}; struct node { int l,r; int t; int id; }b[N * N]; int d[N][N]; bool cmp(node x,node y) { return x.t < y.t; } void bfs(int x,int y) { memset(d,-1,sizeof d); d[x][y] = 0; queue<pair<int,int>>q; q.push({x,y}); while(q.size()) { auto t = q.front(); q.pop(); for(int i = 0; i < 4; i ++) { int xx = dx[i] + t.first, yy = dy[i] + t.second; if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && d[xx][yy] == -1 && a[xx][yy] == 1) { d[xx][yy] = d[t.first][t.second] + 1; q.push({xx,yy}); } } } } int main() { ios::sync_with_stdio(false),cin.tie(0); cin >> n >> m; for(int i = 1; i <= n; i ++) for(int j = 1; j <= m; j ++) { cin >> a[i][j]; if(a[i][j] == 2) { start1 = i; en1 = j; } } int k; cin >> k; for(int i = 1; i <= k; i ++) { b[i].id = i; cin >> b[i].r >> b[i].l; } bfs(start1,en1); map<int,int>mp; for(int i = 1; i <= k; i ++) { if(b[i].l <= 0 || b[i].l > n || b[i].r <= 0 || b[i].r > m) continue; b[i].t = d[b[i].l][b[i].r]; mp[b[i].t] ++; } sort(b + 1,b + 1 + k,cmp); for(int i = 1; i<= k; i ++) if(mp[b[i].t] == 1 && b[i].t != -1) { cout << b[i].id <<" " << b[i].t <<endl; return 0; } puts("No winner."); }