【bzoj1698】[Usaco2007 Feb]Lilypad Pond 荷叶池塘
2017-07-18 18:17
417 查看
Description
为了便于牛们欣赏和锻炼,农夫JOHN在他的农场上新添加了一个美丽的池塘。 JOHN的池塘是一个长方形,他已经把它划分成了M行N列的小正方行 (1 <= M <= 30; 1 <= N <= 30). 某些正方行里是石头,另外一些则是特别结实的荷叶,其余则只有清水。 为了锻炼,Bessie想从一片荷叶跳到另外一片。她的每一次跳跃都是一个象棋中的马步:两行一列或一行两列。 JOHN看到了Bessie并且发现有时Bessie没有办法达到她的目标荷叶。他准备添加一些荷叶来让Bessie完成她的目标。当然,荷叶不能放在石头上。 帮助JOHN找出他最少要放多少片荷叶和他一共有多少种放最少片荷叶的方案。
Input
第1行: 两个整数, M 和 N。
第2~M+1行: 第i+1包含N个数,分别为第i行的N个格子的情况。 0表示格子为空,1表示有一片荷叶,2表示格子里有石头,3表示此格子是Bessie的起点,4 表示此格子是Bessie的目标。
Output
第1行: 一个数,最少情况下需要添加的荷叶数目。如果没有方案存在,输出- 1。
第2行: 一个数,达到最小值的方案总数。这个数保证不超过内设64位整数(long long/ int64)的大小。如果第一行是-1,不要输出此行。
Sample Input
4 5
1 0 0 0 0
3 0 0 0 0
0 0 2 0 0
0 0 0 4 0
输入解释:
池塘含4行5列。Bessie在第2行第1列并且想跳到第4行第4列。池塘里有1块
石头和3片荷叶。
Sample Output
2
3
输出解释:
至少需要2片荷叶。一共有三种摆法:
题解
对于每个0号点,向8个方向搜索,搜到0号点则向其连一条代价为1的边,若搜到1号点,则继续搜索,直到找到0号点,连代价为1的边。这样对于第一问,直接求最短路,对于第二问,再求最短路时求最短路路径数即为方案数。
代码
为了便于牛们欣赏和锻炼,农夫JOHN在他的农场上新添加了一个美丽的池塘。 JOHN的池塘是一个长方形,他已经把它划分成了M行N列的小正方行 (1 <= M <= 30; 1 <= N <= 30). 某些正方行里是石头,另外一些则是特别结实的荷叶,其余则只有清水。 为了锻炼,Bessie想从一片荷叶跳到另外一片。她的每一次跳跃都是一个象棋中的马步:两行一列或一行两列。 JOHN看到了Bessie并且发现有时Bessie没有办法达到她的目标荷叶。他准备添加一些荷叶来让Bessie完成她的目标。当然,荷叶不能放在石头上。 帮助JOHN找出他最少要放多少片荷叶和他一共有多少种放最少片荷叶的方案。
Input
第1行: 两个整数, M 和 N。
第2~M+1行: 第i+1包含N个数,分别为第i行的N个格子的情况。 0表示格子为空,1表示有一片荷叶,2表示格子里有石头,3表示此格子是Bessie的起点,4 表示此格子是Bessie的目标。
Output
第1行: 一个数,最少情况下需要添加的荷叶数目。如果没有方案存在,输出- 1。
第2行: 一个数,达到最小值的方案总数。这个数保证不超过内设64位整数(long long/ int64)的大小。如果第一行是-1,不要输出此行。
Sample Input
4 5
1 0 0 0 0
3 0 0 0 0
0 0 2 0 0
0 0 0 4 0
输入解释:
池塘含4行5列。Bessie在第2行第1列并且想跳到第4行第4列。池塘里有1块
石头和3片荷叶。
Sample Output
2
3
输出解释:
至少需要2片荷叶。一共有三种摆法:
第4行第2列,第2行第3列 第1行第3列,第3行第2列 第1行第3列,第2行第5列 R1C2,R2C3 R1C3,R3C2 R1C3,R2C5 1 0 0 0 0 1 0 X 0 0 1 0 X 0 0 3 0 X 0 0 3 0 0 0 0 3 0 0 0 X 0 0 2 0 0 0 X 2 0 0 0 0 2 0 0 0 X 0 4 0 0 0 0 4 0 0 0 0 4 0
题解
对于每个0号点,向8个方向搜索,搜到0号点则向其连一条代价为1的边,若搜到1号点,则继续搜索,直到找到0号点,连代价为1的边。这样对于第一问,直接求最短路,对于第二问,再求最短路时求最短路路径数即为方案数。
代码
#include<bits/stdc++.h> #define inf 1000000 #define N 150005 #define M 1000005 #define ll long long const int xx[8]={1,1,-1,-1,2,2,-2,-2},yy[8]={2,-2,2,-2,1,-1,1,-1}; using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int tot,ret[M],Next[M],len[M],Head ; int n,m,a[55][55],S,T; bool vis[55][55],flag ; ll ans ;int dis ; struct node{int x,y;}; inline void ins(int u,int v,int l) { ret[++tot]=v;len[tot]=l; Next[tot]=Head[u];Head[u]=tot; } int num(int x,int y){return (x-1)*m+y;} void bfs(int s,int t) { memset(vis,0,sizeof(vis));queue<node>q; q.push((node){s,t});vis[s][t]=1; while (!q.empty()) { int nx=q.front().x,ny=q.front().y;q.pop(); for (int i=0;i<8;i++) { int x=nx+xx[i],y=ny+yy[i]; if (x<1||x>n||y<1||y>m||a[x][y]==2||vis[x][y]) continue; vis[x][y]=1; if (a[x][y]==0) ins(num(s,t),num(x,y),1); if (a[x][y]==4) ins(num(s,t),num(x,y),0); if (a[x][y]==1) q.push((node){x,y}); } } } void spfa() { for (int i=1;i<=n*m;i++) dis[i]=inf; queue<int>q; q.push(S);dis[S]=0;flag[S]=1;ans[S]=1LL; while (!q.empty()) { int now=q.front();q.pop(); for (int i=Head[now];i;i=Next[i]) { if (dis[ret[i]]>dis[now]+len[i]) { dis[ret[i]]=dis[now]+len[i]; ans[ret[i]]=ans[now]; if (!flag[ret[i]])flag[ret[i]]=1,q.push(ret[i]); } else if (dis[ret[i]]==dis[now]+len[i]) { ans[ret[i]]+=ans[now]; if (!flag[ret[i]])flag[ret[i]]=1,q.push(ret[i]); } } flag[now]=0; } } int main() { n=read();m=read(); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { a[i][j]=read(); if (a[i][j]==3) S=num(i,j); if (a[i][j]==4) T=num(i,j); } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (a[i][j]==0||a[i][j]==3) bfs(i,j); spfa();if (dis[T]==inf) return puts("-1"),0; printf("%d\n%lld",dis[T],ans[T]); return 0; }
相关文章推荐
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘 spfa+bfs
- BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
- BZOJ 1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 BFS+最短路
- bzoj1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 [BFS]
- POJ3271/BZOJ 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
- BZOJ 1698 (USACO 2007 Feb)Liypad Pond (黄金)荷叶池塘
- [BZOJ1632][Usaco2007 Feb]Lilypad Pond(spfa)
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond(BFS)
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond bfs
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond【bfs】
- 【C++心路历程35】【bzoj1632】[Usaco2007 Feb]Lilypad Pond
- bzoj:1632: [Usaco2007 Feb]Lilypad Pond
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond (spfa)
- bzoj1632 [Usaco2007 Feb]Lilypad Pond
- bzoj1632 [Usaco2007 Feb]Lilypad Pond
- [BZOJ1632][Usaco2007 Feb]Lilypad Pond(spfa)
- 【BZOJ】1632: [Usaco2007 Feb]Lilypad Pond(bfs)
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond SPFA
- BFS妙题1632: [Usaco2007 Feb]Lilypad Pond