\(\\\)

\(Description\)


一张\(N\times M\)的网格,已知起点和终点,其中有一些地方是落脚点,有一些地方是空地,还有一些地方是坏点。

现在要从起点到终点,每次移动走日字\((\)横一纵二或横二纵一\()\),其中只能经过起点、终点、落脚点。

现在可以开发任意个数的空地变为落脚点,问找到合法路径最少需要开发多少个空地,在满足第一个条件下最少移动多少步,在满足前两个条件下有多少条不同的路径。

  • \(N,M\in [1,30]\)

\(\\\)

\(Solution\)


被上一个题干蒙直接\(NC\)......我还说Silver咋比Gold还难

这题.......仔细读题之后错觉是\(Gold\)那题再加上一层限制的最短路,后来发现不是.......

仔细读题,注意这次的方案数不再是放置落脚点的方案,而是路径数。

那么我们就不必考虑选择不同原有落脚点导致方案同构的尴尬情况了,直接将每一个点向一步可以到达的点建边,如果是从空地向外建边代价为\(1\),其他为\(0\)即可。

最短路计数时有双层限制,注意讨论更新的情况。

\(\\\)

\(Code\)


#include<cmath>
#include<queue>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 50
#define M 60010
#define R register
#define gc getchar
#define inf 9000000000000000ll
using namespace std;
typedef long long ll;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}bool vis[N*N];const int dx[8]={1,1,-1,-1,2,2,-2,-2};const int dy[8]={2,-2,2,-2,1,-1,1,-1};ll ts[N*N],stp[N*N],dis[N*N];
int n,m,s,t,tot,cnt,num[N][N],mp[N][N],hd[N*N];struct edge{int w,to,nxt;}e[M<<1];inline void add(int u,int v,int w){e[++tot].to=v; e[tot].w=w;e[tot].nxt=hd[u]; hd[u]=tot;
}inline void make(int ux,int uy){for(R int i=0,nx,ny;i<8;++i){nx=ux+dx[i]; ny=uy+dy[i];if(nx<1||nx>n||ny<1||ny>m) continue;add(num[ux][uy],num[nx][ny],mp[ux][uy]==0);}
}queue<int> q;inline void SPFA(){memset(vis,0,sizeof(vis));memset(stp,0x3f,sizeof(stp));for(R int i=1;i<=cnt;++i) dis[i]=inf;q.push(s); dis[s]=0;ts[s]=1ll; stp[s]=0;while(!q.empty()){int u=q.front();q.pop(); vis[u]=0;for(R int i=hd[u],v;i;i=e[i].nxt)if(dis[v=e[i].to]>dis[u]+e[i].w){dis[v]=dis[u]+e[i].w;stp[v]=stp[u]+1; ts[v]=ts[u];if(!vis[v]) vis[v]=1,q.push(v);}else if(dis[v]==dis[u]+e[i].w&&stp[v]>stp[u]+1){stp[v]=stp[u]+1; ts[v]=ts[u];if(!vis[v]) vis[v]=1,q.push(v);}else if(dis[v]==dis[u]+e[i].w&&stp[v]==stp[u]+1) ts[v]+=ts[u];}
}int main(){n=rd(); m=rd();for(R int i=1;i<=n;++i)for(R int j=1;j<=m;++j){mp[i][j]=rd();num[i][j]=++cnt;if(mp[i][j]==3) s=cnt;if(mp[i][j]==4) t=cnt;}for(R int i=1;i<=n;++i)for(R int j=1;j<=m;++j)if(mp[i][j]!=2) make(i,j);SPFA();if(dis[t]<inf) printf("%lld\n%lld\n%lld\n",dis[t],stp[t],ts[t]);else puts("-1");return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9737730.html

[ USACO 2007 FEB ] Lilypad Pond (Silver)相关推荐

  1. bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)

    1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 550  Solved: 1 ...

  2. bzoj 1632: [Usaco2007 Feb]Lilypad Pond(BFS)

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 688  Solved: 230 [S ...

  3. Problem : [usaco2007 Feb]Lilypad Pond

    Problem : [usaco2007 Feb]Lilypad Pond Description Farmer John 建造了一个美丽的池塘,用于让他的牛们审美和锻炼. 这个长方形的池子被分割成了 ...

  4. bzoj 1632: [Usaco2007 Feb]Lilypad Pond【bfs】

    直接bfs,在过程中更新方案数即可 #include<iostream> #include<cstdio> #include<queue> using namesp ...

  5. USACO翻译:USACO 2014 FEB SILVER 三题

    USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...

  6. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  7. [USACO 2010 Feb S]Chocolate Eating

    题目: [USACO 2010 Feb S]Chocolate Eating ,哈哈,我们今天来看一道二分答案的题嘛,这是选自USACO上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能 ...

  8. [USACO 2007 Jan S]Protecting the Flowers

    题目: [USACO 2007 Jan S]Protecting the Flowers ,哈哈,我们今天来看一道简单的贪心算法题嘛,这是选自USACO上的一道题,好了,我们一起来看看题意吧: 题目描 ...

  9. P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

最新文章

  1. 禅道设置bug模板_一款热度很高的项目管理和bug工具,免费使用,可在公司推广哦...
  2. 阿里员工哀叹不读书已经没有出路,招聘简历基本都是985
  3. 【RAC】 RAC For W2K8R2 安装--共享磁盘的配置(三)
  4. 教你学习快速排序算法-程序员必备哦
  5. Java并发编程之介绍
  6. 算法:多数元素,多种解法
  7. 已经到了快元旦,可是总是不自在
  8. 【深度学习】保姆级教程,用PyTorch构建第一个神经网络
  9. ActiveReports 报表应用教程 (4)---分栏报表
  10. 前复权后复权程序C# .net
  11. vue-cli 4.x 配置 htmlWebpackPlugin.options.title
  12. @@IDENTITY与SCOPE_IDENTITY()
  13. 如何修改默认浏览器_iPhone可以修改默认浏览器了
  14. hdu 4608 I-number(13多校#1 ,1009)
  15. 【实习之T100开发】Linux 学习笔记
  16. 补天五星计划范围更新,还有单个漏洞额外10000元现金奖励?!
  17. Beta 分布的应用
  18. 新手必须要注意的编程范式
  19. 升腾主机装linux,升腾终端安装说明
  20. 2020电子设计竞赛G题 - 非接触物体尺寸形态测量

热门文章

  1. [c语言]每日一练题库----拯救爱情(占卜爱情)
  2. 辞职创业?没那么简单
  3. 黄河文化论文题目大全.....
  4. K8S(4)DaemonSet
  5. 河南工业大学计算机考研资料汇总
  6. HTML中DIV常用属性
  7. ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)解决办法
  8. 绅白不白2.0淘宝下载项目
  9. 电阻应变式传感器的静态特性研究-物理实验数据处理
  10. Python的turtle模块用法及实例 六:魔法阵七:樱花树 八:小猪佩奇九:多来爱梦