zoukankan      html  css  js  c++  java
  • HDOJ 1428 漫步校园


    漫步校园

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2091    Accepted Submission(s): 602


    Problem Description
    LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗?
     

    Input
    每组测试数据的第一行为n(2=<n<=50),接下来的n行每行有n个数,代表经过每个区域所花的时间t(0<t<=50)(由于寝室与机房均在三楼,故起点与终点也得费时)。
     

    Output
    针对每组测试数据,输出总的路线数(小于2^63)。
     

    Sample Input
    3
    1 2 3
    1 2 3
    1 2 3
    3
    1 1 1
    1 1 1
    1 1 1
     

    Sample Output
    1
    6
     

    Author
    LL
     

    Source
     

    Recommend
    linle
     

    4面都可以走,只能往到离终点距离近的点走。。。。。


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>

    using namespace std;


    struct po
    {
        int x;int y;
    };

    int dir_x[4]={1,-1,0,0};
    int dir_y[4]={0,0,1,-1};

    long long int a[55][55];
    long long int dp[55][55];
    long long int distan[55][55];
    int n;

    void bfs()
    {
        queue<po> q;
        po tlp;
        tlp.x=n-1;  tlp.y=n-1;
        q.push(tlp);

        while(!q.empty())
        {
            po cur=q.front();
            po nxt;
            q.pop();
            for(int i=0;i<4;i++)
            {
                nxt.x=cur.x+dir_x;
                nxt.y=cur.y+dir_y;
                if(nxt.y>=0&&nxt.y<n&&nxt.x>=0&&nxt.x<n&&distan[nxt.x][nxt.y]>distan[cur.x][cur.y]+a[nxt.x][nxt.y])
                {
                    distan[nxt.x][nxt.y]=distan[cur.x][cur.y]+a[nxt.x][nxt.y];
                    q.push(nxt);
                }
            }
        }
    }

    long long int dfs(int x,int y)
    {
        if(dp[x][y]!=0) return dp[x][y];
        if(x==n-1&&y==n-1) return 1;

        for(int i=0;i<4;i++)
        {
            int tx=x+dir_x;
            int ty=y+dir_y;

            if(tx>=0&&tx<n&&ty>=0&&ty<n&&distan[tx][ty]<distan[x][y])
            {
                dp[x][y]+=dfs(tx,ty);
            }
        }
        return dp[x][y];
    }

    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    scanf("%I64d",&a[j]);
                    distan[j]=0x3f3f3f3f;
                }
            }
            distan[n-1][n-1]=0;
            bfs();
            printf("%I64d ",dfs(0,0));
        }

        return 0;
    }


  • 相关阅读:
    笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
    VMware workstation安装
    Redis bigkey分析
    MySQL drop table 影响及过程
    MySQL 大表硬连接删除
    ES elasticsearch 各种查询
    ES elasticsearch 各种聚合
    ES elasticsearch 聚合统计
    ES elasticsearch 实现 count单字段,分组取前多少位,以地理位置中心进行统计
    MySQL行溢出、varchar最多能存多少字符
  • 原文地址:https://www.cnblogs.com/CKboss/p/3351014.html
Copyright © 2011-2022 走看看