zoukankan      html  css  js  c++  java
  • 走出金字塔

    见题(非常毒瘤!!!):

    看见此题的第一印象bfs,典型的染色问题,从一个点向四周点扩散,到目标点时停下来,这时一定是最短用时,可一看数据范围,有点大,可还是抱着练好暴力的思想,硬着头皮打下去...细节超级多...打完真的好累,幸好没有细节出什么问题,提交时得了70分,感觉暴力还行...

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k,s,x1,yy1,tot,ans;
    map<int,map<int,int> >vis;
    map<int,map<int,int> >f;
    struct node
    {
        int x,y,t;
    };
    node a[10000000];
    queue<int>q;
    inline void bfs()
    {
        a[++tot].x=x1;a[tot].y=yy1;
        q.push(tot);vis[x1][yy1]=1;
        while(!q.empty())
        {
            int o=q.front();q.pop();
            int x2=a[o].x;
            int y2=a[o].y;
            int t1=a[o].t;
            if(f[x2][y2]) {ans=t1;return;}
            if(t1>=s) return;
            if(y2%2==1&&vis[x2+1][y2+1]!=1&&x2!=n) 
            {
                a[++tot].x=x2+1;
                a[tot].y=y2+1;
                a[tot].t=t1+k;
                vis[x2+1][y2+1]=1;
                q.push(tot);
            }
            else if(y2%2==0&&vis[x2-1][y2-1]!=1&&x2!=1)
            {
                a[++tot].x=x2-1;
                a[tot].y=y2-1;
                a[tot].t=t1+k;
                vis[x2-1][y2-1]=1;
                q.push(tot);
            }
            if(y2!=1&&vis[x2][y2-1]!=1)
            {
                a[++tot].x=x2;
                a[tot].y=y2-1;
                a[tot].t=t1+k;
                vis[x2][y2-1]=1;
                q.push(tot);
            }
            if(y2!=2*n-1&&vis[x2][y2+1]!=1)
            {
                a[++tot].x=x2;
                a[tot].y=y2+1;
                a[tot].t=t1+k;
                vis[x2][y2+1]=1;
                q.push(tot);
            }
        }
    }
    int main()
    {
        freopen("1.in","r",stdin);
        cin>>n>>m>>k>>s;
        cin>>x1>>yy1;
        for(int i=1;i<=m;i++) 
        {
            int x,y;
            cin>>x>>y;
            f[x][y]=1;
        }
        if(f[x1][yy1])
        {
            cout<<s-1<<endl;
            return 0;
        }
        bfs();
        if(ans) cout<<s-ans-1<<endl;
        else    cout<<-1<<endl;
        return 0; 
    } 

    实在想不到其他思路的我看了看题解:找规律!!!

    嗨!下气。

    于是乎,就又耐着头皮一点一点突破,终于发现了世纪的谜底...

    不想多说什么了,真的好累,这道题搞了我2,3个小时...

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k,s,s1,s2,minn=INT_MAX,ans;
    int main()
    {
        freopen("1.in","r",stdin);
        cin>>n>>m>>k>>s;
        cin>>s1>>s2;
        for(int i=1;i<=m;i++) 
        {
            int x,y;
            ans=0;
            cin>>x>>y;
            if((s2%2==1&&y%2==1)||(s2%2==0&&y%2==0))
            {
                if(s1<x)
                {
                    int t=x-s1;
                    ans=t*2;
                    if(y>s2+t*2) ans+=y-s2-t*2;
                    else if(y<s2) ans+=s2-y;             
                }
                else if(x<s1)
                {
                    int t=s1-x;
                    ans=t*2;
                    if(s2>y+t*2) ans+=s2-y-t*2;
                    else if(s2<y) ans+=y-s2;  
                }
                else if(x==s1) ans=abs(y-s2);
            }
            else 
            {
                if(s1<x)
                {
                    int t=x-s1;
                    ans=t*2-1;
                    if(y>s2+t*2-1) ans+=y-s2-t*2+1;
                    else if(y<s2+1) ans+=s2+1-y;             
                }
                else if(x<s1)
                {
                    int t=s1-x;
                    ans=t*2-1;
                    if(s2>y+t*2-1) ans+=s2-y-t*2+1;
                    else if(s2<y+1) ans+=y+1-s2;  
                }
                else if(x==s1) ans=abs(y-s2);
            }
            minn=min(minn,ans*k);
        }
        if(s-minn-1>=0) cout<<s-minn-1<<endl;
        else            cout<<-1<<endl;
        return 0; 
    }

    代码有点繁琐,鄙人真的不想改了,好累...

    启示:

    遇到题优先考虑贪心与规律!!!(尤其当出现一些正规的图形时:三角形,正方形,网格呀等等...)

    找规律时可以先从特殊点出发,再一步一步发展为普通情况。例如此题,先找从(1,1)到(x,y)的距离,再向一般情况拓展。

  • 相关阅读:
    05Linux系统常用命令
    04Linux系统目录结构
    02Linux文件系统基本结构
    01Linux_BASH基本操作
    [HTML] HTML常用标签及HTML语义化理解
    [Tools] MDN简介及如何使用MDN查找资料
    [HTTP] 初识HTTP
    [Git] Git 入门(常用命令使用)
    [CL](入门)命令行常用命令使用技巧
    IFE_part2_JavaScript_Ajax学习
  • 原文地址:https://www.cnblogs.com/gcfer/p/11191911.html
Copyright © 2011-2022 走看看