被某人拉进了坑 完完全全被坑一天的题……

题意:





正解思路:

先把每一个点搜一遍 预处理出它能在一步之内到的所有点 并连边

然后用一个类似DP的东西把方案数加起来就搞定了

(其实 也不是很难)

但是

我为什么会挂呢

首先 我想偷个懒,想少写一个BFS 就直接按照原来的边搜过去了

当然错了

查了一上午

(对着数据查 小数据竟然全水过去了!!!)

下午颓了会儿

没发现错,,,,,,

晚上在车上的时候 思考人生

诶呦woc?

有荷叶的时候路径不能简单的加和!

要搞定所有的新边

回家以后 乖乖写了第二个BFS 秒切…….

以下是把我拉近坑的那个人的题解:

所以基本思路 搜索 从起点到原点的路径 是水面的就加1。

所以稍微处理了一下,预处理每一个点的需要加1个荷叶的点。1个就好

然后从原点bfs一遍,遇到可以更新的点即 长度大于新的。就把ans从新赋值并且push进去,如果等于就ans【v】+=ans【u】

所以puts答案就好了。

上午一支不对主要在于。一开始的荷叶处理,我想dfs的搜就有可能绕远了,但是其实每个点是可以重复经过的。可是不加vis就会跪。不如循环着 预处理一下每一个点

看起来她很机智嘛

//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,a[33][33],dis[999],sp,ep;
long long ans[999];
int xx[]={2,2,1,1,-1,-1,-2,-2},yy[]={1,-1,2,-2,2,-2,1,-1};
int first[999],next[99999],v[99999],tot;
bool check(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!=2;
}
void add(int x,int y){
v[tot]=y,next[tot]=first[x],first[x]=tot++;
}
void BFS(int X,int Y){
int vis[33][33];
memset(vis,0,sizeof(vis));
queue<pair<int,int> >q;
q.push(make_pair(X,Y)),vis[X][Y]=1;
while(!q.empty()){
int x=q.front().first,y=q.front().second;q.pop();
for(int i=0;i<8;i++){
int dx=x+xx[i],dy=y+yy[i];
if(check(dx,dy)&&!vis[dx][dy]){
vis[dx][dy]=1;
if(a[dx][dy]==1)q.push(make_pair(dx,dy));
else add(X*m+Y,dx*m+dy);
}
}
}
}
void bfs(){
queue<int>q;
q.push(sp);memset(dis,0x3f,sizeof(dis));
dis[sp]=0,ans[sp]=1;
while(!q.empty()){
int t=q.front();q.pop();
for(int i=first[t];~i;i=next[i]){
if(dis[v[i]]>dis[t]+1){
dis[v[i]]=dis[t]+1;
ans[v[i]]=ans[t];
q.push(v[i]);
}
else if(dis[v[i]]==dis[t]+1)
ans[v[i]]+=ans[t];
}
}
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==3)sp=i*m+j;
else if(a[i][j]==4)ep=i*m+j;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
BFS(i,j);
bfs();
if(dis[ep]<=0x3fffff)printf("%d\n%lld",dis[ep]-1,ans[ep]);
else puts("-1");
}

最新文章

  1. 启动了VSAN服务的主机不在vCenter集群中
  2. 分享一个MySQL分库分表备份脚本(原)
  3. Java泛型的历史
  4. Android 利用ImageView显示图片
  5. Android -- 软键盘
  6. 四、BLE(中)
  7. NodeJS学习笔记(转载)
  8. 把一个数组向右循环移动k位要求时间复杂度为O(n)
  9. 云信推送通知 APN invalid Token
  10. python机器学习实战(二)
  11. vue.js实例对象+组件树
  12. 实用 .htaccess 用法大全【转载】
  13. ORACLE之莫名---ORA-02290: 违反检查约束条件
  14. 了解django部署(Django + Uwsgi + Nginx)
  15. 重构JS代码 - 让JS代码平面化
  16. mybatis 批量查询参数语句
  17. Git系列①之仓库管理互联网托管平台github.com的使用
  18. miniui 使用心得
  19. 外购半成品报SHORT问题(非验货客户)
  20. echo 变量不加引号出错

热门文章

  1. Springboot错误问题总结
  2. python 面向对象 封装
  3. (原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器
  4. ajax异步刷新
  5. 可替代google的各种搜索引擎
  6. Pixhawk---烧写FMU/IO bootloader
  7. leetcode——Insertion Sort List 对链表进行插入排序(AC)
  8. CG 内置函数 和 HLSL 内置函数
  9. vue组件的一些知识理解
  10. 安卓开发--WebView