题目大意:

不想介绍,题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1259

bfs求最短路。

这里因为2-9,到达同样的点不计步数,那我们不能每次bfs都遍历一个图找到所有相同的点,所以这里用vector[10],保存对应的2-9的相同的节点

题目本身比较简单,只是考虑的东西有点多,慢慢写就行了

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define N 105
int dir[][] = {{,},{-,},{,},{,-}};
int dp[N][N],n,visit[N][N];
int mat[N][N];
struct Node{
int x,y;
Node(int x=,int y=):x(x),y(y){}
bool operator==(const Node &m)const{
return x == m.x && y == m.y;
}
};
Node st , la;
vector<Node> G[];
queue<Node> q; bool ok(int x,int y){
if(x>= && x<=n && y>= && y<=n && mat[x][y] != )
return true;
return false;
} void bfs()
{
q.push(st);
visit[st.x][st.y] = ;
dp[st.x][st.y] = ;
while(!q.empty()){
Node u = q.front();
//cout<<"test: "<<u.x<<" "<<u.y<<" "<<dp[x][y]<<endl;
q.pop();
if(u == la) continue;
if(mat[u.x][u.y] == ){
for(int i=;i<;i++){
int xx = u.x+dir[i][];
int yy = u.y+dir[i][];
if(ok(xx,yy)){
if(dp[xx][yy] > dp[u.x][u.y] + ){
dp[xx][yy] = dp[u.x][u.y] + ;
if(!visit[xx][yy]){
visit[xx][yy]=;
q.push(Node(xx,yy));
}
}
}
}
}
else{
int t = mat[u.x][u.y];
for(int i=;i<(int)G[t].size();i++){
Node m = G[t][i];
if(m == u) continue;
if(dp[m.x][m.y] > dp[u.x][u.y])
{
dp[m.x][m.y] = dp[u.x][u.y];
if(!visit[m.x][m.y]){
visit[m.x][m.y] = ;
q.push(m);
}
}
}
for(int i=;i<;i++){
int xx = u.x+dir[i][];
int yy = u.y+dir[i][];
if(ok(xx,yy)){
if(dp[xx][yy] > dp[u.x][u.y] + ){
dp[xx][yy] = dp[u.x][u.y] + ;
if(!visit[xx][yy]){
visit[xx][yy]=;
q.push(Node(xx,yy));
}
}
}
}
}
}
} int main()
{
freopen("test.in","rb",stdin);
char a;
while(~scanf("%d",&n)){
//init
for(int i=;i<;i++)G[i].clear();
memset(dp,0x3f,sizeof(dp));
memset(visit,,sizeof(visit)); for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
cin>>a;
if(a == 'S')
{
mat[i][j] = ;
st = Node(i,j);
}
else if(a == 'E')
{
mat[i][j] = ;
la = Node(i,j);
}
else if(a == '' || a == ''){
mat[i][j] = + a - '';
}
else{
mat[i][j] = + a - '';
G[mat[i][j]].push_back(Node(i,j));
}
}
} bfs();
if(dp[la.x][la.y] == 0x3f3f3f3f){
puts("Oh No!");
}
else{
printf("%d\n",dp[la.x][la.y]);
}
}
return ;
}

CSU 1259 bfs找最短路的更多相关文章

  1. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  2. 6.4.2 用BFS求最短路

    前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...

  3. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  4. UVa 816 (BFS求最短路)

    /*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...

  5. BFS求最短路

    假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...

  6. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  7. UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题

    很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...

  8. POJ 2251 Dungeon Master(多层地图找最短路 经典bfs,6个方向)

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 48380   Accepted: 18252 ...

  9. csu - 1659 Graph Center(最短路)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1659 题意是找一个图的中心,图的中心定义是某一个点到其他点的最大距离最小,如果有多个排序输出. 注 ...

随机推荐

  1. Apusic中间件结合MyEclipse进行远程调试记录

    Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...

  2. E. Comments dfs模拟

    http://codeforces.com/contest/747/problem/E 首先,把字符串变成这个样子. hello,2,ok,0,bye,0,test,0,one,1,two,2,a,0 ...

  3. VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案

    1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式,将目标-->指向exe文件,位置Ctrl+v. ...

  4. vue-element:文件上传七牛之key和异步的问题

    效果图: html 代码: <el-form-item label="Excel文件" :label-width="formLabelWidth" pro ...

  5. iOS Programming UIGestureRecognizer and UIMenuController

    iOS  Programming  UIGestureRecognizer and UIMenuController A UIGestureRecognizer intercepts touches ...

  6. spring-mvc hello world (1)

    我学习一个程序,都是从DEMO开始的. 先不了解SPRING-MVC的原理,但一些小的概念还是需要了解的.由于之前有过SSH的工程经验,故基本的东东,不在叙述. 1.准备环境 JAR包:

  7. 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)

    本篇主要讲配置Windows 故障转移集群及遇到的相关问题(坑),因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 四种集群的仲裁配置: 1.多 ...

  8. java web 学习笔记 - JSP标签编程

    1.JSP标签编程简介 标签编程在开发中并不常见,主要是为了更好的理解struts等框架的标签而打基础,完善相关知识体系. 标签编程分为: 一个继承自TagSupport的标签类,一个在WEB-INF ...

  9. 以JSONobject形式提交http请求

    总结一下设置图标的三种方式: (1)button属性:主要用于图标大小要求不高,间隔要求也不高的场合. (2)background属性:主要用于能够以较大空间显示图标的场合. (3)drawableL ...

  10. CAD使用DeleteXData删除数据(com接口)

    主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 c#代码实现如下 ...