题目大意:

不想介绍,题目链接: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. 暴力/图论 hihoCoder 1179 永恒游戏

    题目传送门 /* 暴力:也是暴力过了,无语.无向图,两端点都要加度数和点 */ #include <cstdio> #include <algorithm> #include ...

  2. 【转】JAVA的静态变量、静态方法、静态类

    转自:http://blog.csdn.net/zhandoushi1982/article/details/8453522/ 静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. ( ...

  3. 老式浏览器支持html5和css3

    在IE页面的head标签里面加入   <!-[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/ ...

  4. 自学 iOS - 三十天三十个 Swift 项目 第三天

    做了这个小demo 之后  感觉OC 和swift 还是有很大的差别的 自己还是要去多看些swift的语法 用的不是很熟练 1.这个demo 的资源文件 我都是用原工程的 2.同样的自定义cell 的 ...

  5. hihocoder offer收割编程练习赛12 B 一面砖墙

    思路: 就是求哪个长度出现的次数最多. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...

  6. 平板&Safari 开发tips

    css: *{ margin: 0; padding: 0;  /* 禁止用户点选网页内容 */ -webkit-touch-callout:none; -webkit-user-select:non ...

  7. 新浪qq登录

    一:到腾讯QQ互联上申请APPID和APPKEY.申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY.新浪微博的申请同理 二:在Th ...

  8. object -c OOP , 源码组织 ,Foundation 框架 详解1

     object -c  OOP ,  源码组织  ,Foundation 框架 详解1 1.1 So what is OOP? OOP is a way of constructing softwar ...

  9. ASP.NET Eval四种绑定方式 及详解

    1.1.x中的数据绑定语法 <asp:Literal id="litEval2" runat="server" Text='<%#DataBinde ...

  10. JavaScript——分页