题目大意:

不想介绍,题目链接: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. AC自动机 HDOJ 5384 Danganronpa

    题目传送门 /* 题意:多个文本串,多个模式串在每个文本串出现的次数 AC自动机:这就是一道模板题,杭电有道类似的题目 */ /************************************ ...

  2. 配置Ubuntu16.04第02步:更改镜像源,更新系统

    Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更新源(就是这些软件所在的服务器),一般直接百度Ubuntu更新源就能出来一大堆,这时候最好是找和自己 ...

  3. how-to-fix-fs-re-evaluating-native-module-sources-is-not-supported-graceful

    http://stackoverflow.com/questions/37346512/how-to-fix-fs-re-evaluating-native-module-sources-is-not ...

  4. github下载下来的C#控制台小游戏[含源码]

    早就听说了github是世界最大的源码库,但自己却不是很懂,今天去研究了下,注册了一个帐号,然后在上面搜索了一下C# game,然后发现有许多的游戏. 随意地选择了一个,感觉比较简单,于是就下载了下来 ...

  5. 总结用CoreText绘制文本时遇到的问题以及解决办法

    关于CoreText不做解释.用的人自然知道这个是干什么的. 功能非常强大,可以绘制文本,图片等. 这次用的Xcode7.0的版本.所以之前很多方法,现在不能用.也不是不能用,就是有黄色警告很不爽. ...

  6. 关于如何读取XML文件的一个简单方法

    在平时开发系统功能的时候,我们经常会碰到一些需求需要经常性的发生变化,比如 系统版本.更新日志 等等.这个时候用一个XML文件来替代数据库,就会变的简便很多. 前段时候我也正好需要改个需求,是关于客户 ...

  7. AJPFX理解反射及反射的应用

    怎么理解反射,反射的应用        反射就是把Java类中的各种成分映射成相应的Java类.        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...

  8. Spring Cloud是什么?

    [学习笔记] 3)Spring Cloud是什么?马克-to-win@马克java社区:i)Spring Cloud是一个微服务框架,Spring Cloud基于微服务基础框架Netflix进行了up ...

  9. Myeclipse 6.0代码

    import java.util.*; import java.io.*; public class bbs { private static final String LL = "Deco ...

  10. Struts1 MVC框架的工作原理

    MVC英文及Model-View-Controller,分别是模型(Model),视图(View)和控制(Controller).MVC模式的目的是实现web系统的职能分工. View:即用户交互界面 ...