解题思路:反向搜索,以终点为起点,广度优先搜索
用mp<pair,vector<pari>>来存储某个点存放的门
注意事项:
在搜索四个方向后,再加上这个点拥有的门,其他的与广搜无异
参考代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+10;
typedef pair<int,int> pll;
bool v[N][N];
long long int n,m,x3,y3,x2,y2,ans;
map<pll,vector<pll>> s;
queue<pll> q;
long long int dis[N][N];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x3>>y3>>x2>>y2;
s[{x3,y3}].push_back({x2,y2});
s[{x2,y2}].push_back({x3,y3});
}
q.push({n,n});
v[n][n]=true;
dis[n][n]=0;
while(q.empty()==0)
{
pll t=q.front();
q.pop();
int x=t.first,y=t.second;
for(int k=0;k<4;k++)
{
int tx=x+dir[k][0],ty=y+dir[k][1];
if(v[tx][ty]==false&&tx>=1&&tx<=n&&ty>=1&&ty<=n)
{
//printf("%d %d to %d %d\n",x,y,tx,ty);
dis[tx][ty]=dis[x][y]+1;
v[tx][ty]=1;
q.push({tx,ty});
}
if(s.find({x,y})!=s.end())
{
for(int j=0;j<s[{x,y}].size();j++)
{
tx=s[{x,y}][j].first,ty=s[{x,y}][j].second;
if(v[tx][ty]==false&&tx>=1&&tx<=n&&ty>=1&&ty<=n)
{
dis[tx][ty]=dis[x][y]+1;
v[tx][ty]=1;
q.push({tx,ty});
}
}
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ans+=dis[i][j];
double up=ans,down=n*n;
printf("%.2f\n",up/down);
return 0;
}
0.0分
0 人评分
1908题解浏览:680 |
星期判断机 (C语言代码)浏览:892 |
1048题解(读入回车问题)浏览:628 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:612 |
C语言训练-最大数问题 (C语言代码)浏览:668 |
多组数据新方法浏览:368 |
C语言程序设计教程(第三版)课后习题6.9 (C++代码)浏览:522 |
简单的a+b (C语言代码)浏览:443 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:3412 |
【亲和数】 (C++代码)浏览:553 |