zoukankan      html  css  js  c++  java
  • 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跑的飞快嘿嘿嘿。

  • 相关阅读:
    使用awrrpt.sql 生成AWR报告
    oracle简单物化视图
    oracle 查询重复内容
    windows server 2008 服务器 oracle11g降级oracle10g遇到的种种问题
    简单js条码生成器
    tomcat服务器禁用非post、get方法的坑
    委托和事件
    消息队列(Message Queue)简介及其使用
    架构师修炼之道
    Xcode7 使用NSurl发送HTTP请求报错
  • 原文地址:https://www.cnblogs.com/qywyt/p/9493216.html
Copyright © 2011-2022 走看看