p1824
这道题是不是看起来超级像动态规划什么骚东西啊?
然后机智的我写了一个dfs。
先把所有点的答案弄成一个比1000大的数。然后从每一个绿点出发向向周围dfs,如果四周某个方向比自己加一大就带着自己的加一进去更新它并且继续dfs。直到所有的点再这个绿点存在的情况下能更新都都更新了就去dfs下一个点。
输出答案的时候就是O(1)了。
然后我发现直接这样写是会超时很多组的,觉得一定是自己的算法错了,垂死挣扎的想了一个优化:第一个绿点直接去更新大家,不用dfs。因为第一个绿点是最最耗时间的,其他的都不能遍历整张图,而第一个点可以。然后就交了一下就发现过了……
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<vector> #include<map> #include<stack> #include<queue> #include<deque> #include<set> using namespace std; int ans[510][510]; int i,f,tx,ty; int n,m,X,Y,sum; void dfs(int x,int y,int now) { ans[x][y]=now; if(x==0||x==n+1||y==0||y==m+1) return ; now++; if(ans[x+1][y]>now)dfs(x+1,y,now); if(ans[x-1][y]>now)dfs(x-1,y,now); if(ans[x][y+1]>now)dfs(x,y+1,now); if(ans[x][y-1]>now)dfs(x,y-1,now); } int main() { cin>>n>>m>>X>>Y; cin>>tx>>ty; for(i=0;i<=n+1;i++) for(f=0;f<=m+1;f++) ans[i][f]=abs(i-tx)+abs(f-ty); for(i=2;i<=X;i++) { cin>>tx>>ty; dfs(tx,ty,0); } for(i=1;i<=Y;i++) cin>>tx>>ty,cout<<ans[tx][ty]<<endl; }
dfs跑的飞快嘿嘿嘿。