漫步校园

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
 
题解:设F[i][j]表示,从(i,j),跑到终点的方案数,我们用spfa预处理出当前节点到终点的距离,对于距离变大的,就不可以进行状态转移,
然后记忆化搜索,把可行的地方的方案数加起来就可以了。
#include<iostream>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#define ll long long
using namespace std;
int n;
ll mp[][],dis[][];
int addx[]={,,-,,},addy[]={,,,,-};
int have[][];
ll f[][];
void spfa(int starx,int stary){
queue<int> xx,yy;
while(!xx.empty()) xx.pop();
while(!yy.empty()) yy.pop();
xx.push(starx);
yy.push(stary);
dis[starx][stary]=mp[starx][stary],have[starx][stary]=;
while(!xx.empty()){
int nowx=xx.front();
int nowy=yy.front();
xx.pop(),yy.pop();
have[nowx][nowy]=;
for(int i=;i<=;i++){
int tox=nowx+addx[i],toy=nowy+addy[i];
if(tox<=||tox>n||toy>n||toy<=) continue;
if(dis[tox][toy]>dis[nowx][nowy]+mp[tox][toy])
{
dis[tox][toy]=dis[nowx][nowy]+mp[tox][toy];
//printf("nowx=%d nowy=%d tox=%d toy=%d\n",nowx,nowy,tox,toy);
//printf("dis[nowx][nowy]=%d dis[tox][toy]=%d mp[tox][toy]=%d\n",dis[nowx][nowy],dis[tox][toy],mp[tox][toy]);
if(have[tox][toy]==){
xx.push(tox);
yy.push(toy);
have[tox][toy]=;
}
}
}
}
}
void cl(){
memset(mp,,sizeof(mp));
memset(f,,sizeof(f));
memset(have,,sizeof(have));
memset(dis,,sizeof(dis));
}
ll dp(int x,int y){
if(f[x][y]) return f[x][y];
if(x==n&&y==n) return ;
ll now=;
for(int i=;i<=;i++){
int tox=x+addx[i];
int toy=y+addy[i];
if(tox<=||tox>n||toy>n||toy<=) continue;
if(dis[tox][toy]<dis[x][y]) now+=dp(tox,toy);
}
return f[x][y]=now;
}
int main(){
while(scanf("%d",&n)!=EOF){
cl();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
cin>>mp[i][j];
spfa(n,n);
printf("%lld\n",dp(,));
}
}

最新文章

  1. 二进制包安装MySQL数据库
  2. jquery1.9以上版本如何使用toggle函数
  3. x86平台转x64平台关于内联汇编不再支持的解决
  4. django小结
  5. Codeforces Round #285 (Div.1 B &amp; Div.2 D) Misha and Permutations Summation --二分+树状数组
  6. ioctl用法详解 (网络)
  7. jQuery的on方法和bind绑定多个事件
  8. MySQL数据库备份还原(基于binlog的增量备份)
  9. C++动态分配内存
  10. nginx定时备份access访问日志并重启nginx
  11. Javascript实现表格行排序
  12. Postgresql standby(备机只读)环境搭建
  13. JavaWeb三层结构---课设02
  14. 【model模型传入view的数据类型错误】传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[MapScience.PovertyAlleviation.Web.Models.Qu
  15. web报表工具FineReport常用函数的用法总结(数学和三角函数)
  16. 启发式合并&amp;线段树合并/分裂&amp;treap合并&amp;splay合并
  17. 创建一个dynamics 365 CRM online plugin (三) - PostOperation
  18. 一篇极好的Git 总结
  19. centos6.5安装部署zabbix监控服务端和客户端
  20. SharePoint 2016 站点注册工作流服务报错

热门文章

  1. 实现一个基于码云Storage
  2. 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)
  3. jsp页面直接输出了html代码
  4. 小白专场-多项式乘法与加法运算-python语言实现
  5. CS中委托与事件的使用-以Winform中跨窗体传值为例
  6. 树、图、堆、STL(来自菜鸡的&quot;炒鸡&quot;干粮)
  7. 菜鸟 ssm 框架的学习之路
  8. MOOC web前端开发笔记(一)
  9. 25 (OC)* iOS网络HTTP、TCP、UDP、Socket 知识总结
  10. 20 (OC)* GCD、NSOperation、NSThread。多线程