CSU 1259 bfs找最短路
题目大意:
不想介绍,题目链接: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找最短路的更多相关文章
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- 6.4.2 用BFS求最短路
前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- UVa 816 (BFS求最短路)
/*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...
- BFS求最短路
假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- UVA 11624 UVA 10047 两道用 BFS进行最短路搜索的题
很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M): UVA 11624 写的比较挫 #include <iostream> #include ...
- POJ 2251 Dungeon Master(多层地图找最短路 经典bfs,6个方向)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 48380 Accepted: 18252 ...
- csu - 1659 Graph Center(最短路)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1659 题意是找一个图的中心,图的中心定义是某一个点到其他点的最大距离最小,如果有多个排序输出. 注 ...
随机推荐
- 字符串处理 BestCoder Round #43 1001 pog loves szh I
题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...
- Matlab调用C程序 分类: Matlab c/c++ 2015-01-06 19:18 464人阅读 评论(0) 收藏
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快.但若运算中涉及到大量循环,Matlab的速度令人难以忍受的.当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C ...
- 加密解密(4)SSL协议及HTTPS握手过程
SSL协议 简介 SSL (Secure Sockets Layer 安全套接层)是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性.因特网的 超文本传输协议 (HTTP)使用 ...
- 223 Rectangle Area 矩形面积
在二维平面上计算出两个由直线构成的矩形叠加覆盖后的面积. 假设面积不会超出int的范围. 详见:https://leetcode.com/problems/rectangle-area/descrip ...
- 浏览器和ES5的介绍
浏览器的组成 : shell(浏览器的外壳).内核(渲染引擎.js引擎)主流浏览器及其内核: IE tritent(IE9及以下,IE10及以上用webkit) ...
- mysql执行语句汇总
插入select的数据 INSERT INTO `test1`( order_id, goods_id, goods_name, goods_sn, product_id, goods_number, ...
- UI动画效果
UI界面的动画效果总结 方式1:头尾式 //开始动画 [UIView beginAnimations:nil context:nil]; //设置动画时间 [UIView setAnimationDu ...
- 一些常用的meta标签及其作用
声明文档使用的字符编码 <meta charset='utf-8'>优先使用 IE 最新版本和 Chrome <meta http-equiv="X-UA-Compat ...
- c++通过管道pipe获取cmd输出的字符
#include <stdio.h>#include<iostream>#include<string>using namespace std; // 描述:exe ...
- Python_高阶函数、装饰器(decorator)
一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...