HDOJ 1428-漫步校园【搜索】

小鱼儿 2022-07-26 00:13 193阅读 0赞

漫步校园

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3764 Accepted Submission(s): 1146

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

  1. 3
  2. 1 2 3
  3. 1 2 3
  4. 1 2 3
  5. 3
  6. 1 1 1
  7. 1 1 1
  8. 1 1 1

Sample Output

  1. 1
  2. 6

Author

LL

Source

ACM暑期集训队练习赛(三)

解题思路:

先要记录每个点到终点的最短距离,用深搜记录最短路每个点有多少条路。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<queue>
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. struct node
  8. {
  9. int x,y;
  10. int time;
  11. };
  12. int n;
  13. int dx[4]={0,0,-1,1};
  14. int dy[4]={-1,1,0,0};
  15. int map[60][60];
  16. long long v[60][60],dp[60][60];
  17. void BFS()//找到每个点到(n,n)的最短距离
  18. {
  19. int i,j;
  20. node f1,f2;
  21. f1.x=n;
  22. f1.y=n;
  23. f1.time=map[n][n];
  24. queue<node>q;
  25. v[n][n]=map[n][n];
  26. q.push(f1);
  27. while(!q.empty())
  28. {
  29. f1=q.front();
  30. q.pop();
  31. for(i=0;i<4;i++)
  32. {
  33. f2.x=f1.x+dx[i];
  34. f2.y=f1.y+dy[i];
  35. if(f2.x>0&&f2.y>0&&f2.x<=n&&f2.y<=n)
  36. {
  37. f2.time=f1.time+map[f2.x][f2.y];
  38. if(f2.time<v[f2.x][f2.y])
  39. {
  40. v[f2.x][f2.y]=f2.time;
  41. q.push(f2);
  42. }
  43. }
  44. }
  45. }
  46. }
  47. long long DFS(int x,int y)
  48. {
  49. if(x==n&&y==n)
  50. {
  51. return 1;
  52. }
  53. if(dp[x][y]!=0)
  54. {
  55. return dp[x][y];
  56. }
  57. int x1,y1;
  58. long long sum=0;
  59. for(int i=0;i<4;i++)
  60. {
  61. x1=x+dx[i];
  62. y1=y+dy[i];
  63. if(x1>=1&&y1>=1&&x1<=n&&y1<=n)
  64. {
  65. if(v[x][y]>v[x1][y1])
  66. {
  67. sum+=DFS(x1,y1);
  68. dp[x][y]=sum;
  69. }
  70. }
  71. }
  72. return sum;
  73. }
  74. int main()
  75. {
  76. int i,j;
  77. while(scanf("%d",&n)!=EOF)
  78. {
  79. for(i=1;i<=n;i++)
  80. {
  81. for(j=1;j<=n;j++)
  82. {
  83. scanf("%d",&map[i][j]);
  84. v[i][j]=INF;
  85. }
  86. }
  87. BFS();
  88. memset(dp,0,sizeof(dp));
  89. printf("%lld\n",DFS(1,1));
  90. }
  91. return 0;
  92. }

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 漫步云中网络

     阅读本文前,最好能先了解以下的知识: [了解 OpenStack][OpenStack] 将有助于对本文的理解。本文讲解的是 Linux 虚拟网络中的一般原理方

    相关 简单随机漫步

         最近在看用Python进行数据分析这本书,里面提到了随机漫步,所以试了试。      今天把代码放这里,以后随时可以看看。 \\\\\\\\\\\\\\\\\\一