题目大意:

不想介绍,题目链接: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. 区间DP UVA 10739 String to Palindrome

    题目传送门 /* 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 即dp[j+1][k ...

  2. angular.module 参数的意思

    定义一个module需要两个参数,第一个作为module的名字,第二个则是指出这个module都依赖哪些别的modules

  3. Java_JDBC连接数据库_使用读取配置文件的方式

    package com.homewoek3_4.dao; import java.io.IOException; import java.io.InputStream; import java.sql ...

  4. oracle数据库常用的99条查询语句

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  5. node入门(一)——安装

    node可以让我们用js写服务器.此外还可以用来前端自动化开发,它找到特定服务要使用的包,然后下载.安装.管理. 首先安装node,进入官网下载需要的node版本,然后一键式傻瓜安装.(我的环境是wi ...

  6. String的用法——判断功能

    package cn.itcast_03; /* String的判断功能: 1.boolean equals(Object obj):字符串的内容是否相同,区分大小写 2.boolean equals ...

  7. negroni-gzip源码简单分析解读

    negroni-gzip源码简单分析解读 这是一个为Negroni设计的gzip压缩处理中间件,需要用到已有的compress中的gzip,阅读了不长的源码之后,总结了一些关键要点和注意点. 检查是否 ...

  8. 白话容器namespace

    进入正题之前是例行装X环节: 过年7天吃的,花了45天又回来了. 近年来容器大火,也正是因为容器,生生灭掉了一个IT岗位!哥也是被生生的逼上了邪路. 那究竟什么是容器呢? 就三个字:它就是个进程!(多 ...

  9. Windows 如何使用telnet管理虚拟机Linux

    Linux远程登录的工具很多,如putty,SecureCRT…… 其实借助Windows的telnet工具就可以在命令提示符轻松的登录到Linux系统进行操作了. 虽然telnet很简单,但还是要进 ...

  10. 合并百度影音的离线数据 with python 2.1 bdv格式的更新

    最近百度影音的离线下载文件,格式有新变化. 经过分析,是bdv格式又有新格式,从最初的bdv0001,到bdv.config 的file....,这次更新的格式是直接包含一个片段,其中还有使用guid ...