zoukankan      html  css  js  c++  java
  • HDU

    漫步校园

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


    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
     
    题意:
    找 (1,1)->(n,n)有多少种路径,每一步往下一步走的时候,满足下一步到(n, n)的距离比当前到(n, n)的距离短;
    题解:
    bfs预处理所有点到(n, n)的距离,然后记忆化dfs
    代码:
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <bitset>
     6 #include <vector>
     7 #include <queue>
     8 #include <stack>
     9 #include <cmath>
    10 #include <list>
    11 #include <set>
    12 #include <map>
    13 #define rep(i,a,b) for(int i = a;i <= b;++ i)
    14 #define per(i,a,b) for(int i = a;i >= b;-- i)
    15 #define mem(a,b) memset((a),(b),sizeof((a)))
    16 #define FIN freopen("in.txt","r",stdin)
    17 #define FOUT freopen("out.txt","w",stdout)
    18 #define IO ios_base::sync_with_stdio(0),cin.tie(0)
    19 #define mid ((l+r)>>1)
    20 #define ls (id<<1)
    21 #define rs ((id<<1)|1)
    22 #define N 55
    23 #define INF 0x3f3f3f3f
    24 #define INFF ((1LL<<62)-1)
    25 using namespace std;
    26 typedef long long LL;
    27 typedef pair<int, int> PIR;
    28 const double eps = 1e-8;
    29 
    30 int n, G[N][N], dis[N][N], dir[4][2] = {0,1,0,-1,1,0,-1,0};
    31 LL dp[N][N];
    32 bool vis[N][N];
    33 struct Node{
    34     int x, y, c;
    35     Node(int _x, int _y, int _c)    { x = _x; y = _y; c = _c; }
    36     bool operator < (const Node &r) const   { return c > r.c; }
    37 };
    38 bool judge(int x, int y){
    39     if(x < 1 || x > n || y < 1 || y > n)    return false;
    40     return true;
    41 }
    42 void bfs(){
    43     priority_queue <Node> Q;
    44     mem(dis, INF);
    45     mem(vis, false);
    46     Q.push(Node(n, n, G[n][n]));
    47     dis[n][n] = G[n][n];
    48     while(!Q.empty()){
    49         Node h = Q.top();
    50         Q.pop();
    51         int xx = h.x, yy = h.y;
    52         if(vis[xx][yy]) continue;
    53         vis[xx][yy] = true;
    54         rep(i, 0, 3){
    55             int xi = xx+dir[i][0], yi = yy+dir[i][1];
    56             if(judge(xi, yi) && dis[xx][yy]+G[xi][yi] < dis[xi][yi]){
    57                 dis[xi][yi] = dis[xx][yy]+G[xi][yi];
    58                 Q.push(Node(xi, yi, dis[xi][yi]));
    59             }
    60         }
    61     }
    62     return ;
    63 }
    64 LL dfs(int x, int y){
    65     if(dp[x][y])    return dp[x][y];
    66     rep(i, 0, 3){
    67         int xi = x+dir[i][0], yi = y+dir[i][1];
    68         if(judge(xi, yi) && dis[x][y] > dis[xi][yi]){
    69             dp[x][y] += dfs(xi, yi);
    70         }
    71     }
    72     return dp[x][y];
    73 }
    74 int main()
    75 {IO;
    76     //FIN;
    77     while(cin >> n){
    78         rep(i, 1, n){
    79             rep(j, 1, n)    cin >> G[i][j];
    80 
    81         }
    82         bfs();
    83         mem(dp, 0);
    84         dp[n][n] = 1;
    85         dfs(1, 1);
    86         cout << dp[1][1] << endl;
    87     }
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    使用ADO.NET查询和操作数据
    使用ADO.NET查询和访问数据库
    连接查询和分组查询
    SQL
    HTML5基础
    使用Java理解程序逻辑错题
    幸运抽奖项目
    吃货联盟项目
    人机猜拳项目
    JavaDoc注释
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6389375.html
Copyright © 2011-2022 走看看