链接:点击打开链接

题意:给定一个N*M图,和一个由‘X’组成的联通的图案,‘*’代表起点。现在从起点走一圈并且包围所有的‘X’,最后回到起点,求最短的路径

代码:

#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
char s[105][105];
int vis[105][105];
int xx[]={-1,-1,-1,1,1,1,0,0,};
int yy[]={-1,0,1,-1,0,1,1,-1};
int n,m,tmp,stx,sty,linl,linx,liny;
struct node{int x,y,sum;friend bool operator<(node a,node b){return a.sum>b.sum;}
};
int judge(int x,int y){int i;if(s[x][y-1]!='X')return 0;for(i=y;i<=m;i++)if(s[x][i]=='X')return 0;return 1;
}
void bfs(int op){node tt;int i,j,tmpx,tmpy;priority_queue<node> qu;memset(vis,0,sizeof(vis));qu.push((node){linx,liny,0});vis[linx][liny]=1;while(qu.size()){tt=qu.top();qu.pop();if(tt.x==stx&&tt.y==sty){tmp+=tt.sum;return;}for(i=0;i<8;i++){                       //如果在线上则控制不能向上或向下if(tt.x==linx&&tt.y>=linl&&tt.y<=m&&i<6){if(op==0&&i<=2)continue;if(op==1&&i>=3)continue;}tmpx=tt.x+xx[i];tmpy=tt.y+yy[i];if(tmpx<=0||tmpx>n||tmpy<=0||tmpy>m||s[tmpx][tmpy]=='X'||vis[tmpx][tmpy]==1)continue;vis[tmpx][tmpy]=1;qu.push((node){tmpx,tmpy,tt.sum+1});}}
}
int main(){                                     //在这个联通图案的右边界选一个点连到右边界int i,j,ans;                                //那么起点所围成的路径必定经过这条线段,那while(scanf("%d%d",&n,&m)!=EOF){            //么只要以线段上的每一个点为起点,分别向上for(i=1;i<=n;i++){                      //和向下进行进行搜索,取和最小即为答案scanf("%s",s[i]+1);for(j=1;j<=m;j++){if(s[i][j]=='*')stx=i,sty=j;}}for(i=1;i<=n;i++){                      //选最右边界点for(j=2;j<=m;j++){if(judge(i,j)){linx=i,linl=liny=j;goto next;}}}next:linl=liny,ans=INF;while(liny<=m){                     //枚举线上的点tmp=0;bfs(0);bfs(1);ans=min(ans,tmp);liny++;}printf("%d\n",ans);}return 0;
}                                               //因为数据水了一点,其实可以很容易发现
/*                                              //一个很明显的问题,当起点恰好在这条线
3 3                                             //上的时候我们应该怎么办...
...                                             //比如这组样例
.X*                                             //但是我感觉只要重新找一个左边界点,是
...                                             //不是就能解决这个问题了....
*/

poj3182(bfs)相关推荐

  1. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...

  2. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  3. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  4. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  5. 数据结构--搜索BFS

    文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...

  6. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝

    题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...

  7. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  8. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  9. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

最新文章

  1. mysql format函数对数字类型转化的坑
  2. MySQL数据库一个字段对应多个值得模糊查询
  3. 黑马C++设计模式2
  4. 表格控件对比_小白如何开发出苏宁易购同款表格协同文档系统?
  5. magento图片处理 Customize Magento’s Image Resize Functionality
  6. Python 列表笔记
  7. VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)...
  8. CTime类,CTime 与 CString转换
  9. 根据控件ID得到句柄
  10. android wifi 问题是什么意思,Android应用开发之wifi连接问题:密码正确但连接时supplicant state返回的是ERROR_AUTHENTICATING...
  11. 《计算机网络思想》系列(1)网络体系结构———理解,总结,辨析,升华
  12. Axure RP for Mac中文汉化破解版
  13. MindManager22全新版思维导图软件工具
  14. 计算机用户授权原则,涉密信息系统严格设定用户权限,按照什么密级防护和什么授权管理的原则...
  15. C#学员管理系统(源代码)
  16. linux 囊括所有安装
  17. python求音频的梅尔倒谱系数
  18. ubuntu如何查看当前的ROS发行版本
  19. 提升工作效率的软件及网站(不断更新中)
  20. 记一次replace into引发的死锁问题

热门文章

  1. android微信炸弹代码,微信炸弹怎么弄 微信8.0扔炸弹攻略[多图]
  2. 计蒜客信息学3月普及组模拟赛
  3. 【题解反思】海亮信息集训A-B班-分治初步专项
  4. 八皇后问题及其解决方案
  5. 5日均线在c语言中的写法,一文学会正确运用5日均线!(图解)
  6. html背景图片溢出,如何清除背景图片溢出?
  7. 蓝牙技术|2028 年智能音箱市场将达290亿美元,伦茨科技推出(Alexa,Echo音箱)亚马逊App直连幻彩灯方案
  8. 修复鼠标右键没有vscode快捷入口的问题
  9. 把notepad++添加到右键打开方式(解决 打开方式 没有notepad++编辑器情况)
  10. Apache2 虚拟主机 详解