Find a way (BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

BFS搜索  目标地  并记录下来  之后再判断两段路程之和

代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <math.h>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <ctype.h>
  7 #include <iomanip>
  8 #include <queue>
  9 #include <stdlib.h>
 10 using namespace std;
 11
 12 #define INF 0x3f3f3f3f
 13 #define N 220
 14 #define M 220
 15 int n,m;
 16 char mp[N][M];
 17 int vis1[N][M],vis2[N][M];
 18 int ans1[N][M],ans2[N][M];
 19 int dx[4]={0,0,1,-1};
 20 int dy[4]={1,-1,0,0};
 21
 22 struct node
 23 {
 24     int x,y;
 25     int t;
 26 };
 27
 28 node g1,g2;
 29 void getMp()
 30 {
 31     for(int i=0; i<n; i++){
 32         for(int j=0; j<m; j++){
 33             cin>>mp[i][j];
 34             if(mp[i][j]==‘Y‘){
 35                 g1.x=i;
 36                 g1.y=j;
 37                 g1.t=0;
 38                 vis1[i][j]=1;
 39             }
 40             if(mp[i][j]==‘M‘){
 41                 g2.x=i;
 42                 g2.y=j;
 43                 g2.t=0;
 44                 vis2[i][j]=1;
 45             }
 46         }
 47     }
 48 }
 49
 50 void bfs1()
 51 {
 52     queue<node> q;
 53     while(!q.empty())
 54         q.pop();
 55     q.push(g1);
 56     while(!q.empty()){
 57         node f1;
 58         f1=q.front();
 59         q.pop();
 60         for(int i=0; i<4; i++){
 61             node f2;
 62             f2.x=f1.x+dx[i];
 63             f2.y=f1.y+dy[i];
 64             f2.t=f1.t;
 65             if(0<=f2.x&&f2.x<n&&0<=f2.y&&f2.y<m&&!vis1[f2.x][f2.y]&&mp[f2.x][f2.y]!=‘#‘){
 66                 f2.t++;
 67                 if(mp[f2.x][f2.y]==‘@‘){
 68                     ans1[f2.x][f2.y]=f2.t;
 69                 }
 70                 vis1[f2.x][f2.y]=1;
 71                 q.push(f2);
 72             }
 73         }
 74     }
 75 }
 76
 77 void bfs2()
 78 {
 79     queue<node> q;
 80     while(!q.empty())
 81         q.pop();
 82     q.push(g2);
 83     while(!q.empty()){
 84         node f1;
 85         f1=q.front();
 86         q.pop();
 87         for(int i=0; i<4; i++){
 88             node f2;
 89             f2.x=f1.x+dx[i];
 90             f2.y=f1.y+dy[i];
 91             f2.t=f1.t;
 92             if(0<=f2.x&&f2.x<n&&0<=f2.y&&f2.y<m&&!vis2[f2.x][f2.y]&&mp[f2.x][f2.y]!=‘#‘){
 93                 f2.t++;
 94                 if(mp[f2.x][f2.y]==‘@‘){
 95                     ans2[f2.x][f2.y]=f2.t;
 96                 }
 97                 vis2[f2.x][f2.y]=1;
 98                 q.push(f2);
 99             }
100         }
101     }
102 }
103
104 int main()
105 {
106     while(~scanf("%d %d",&n,&m)){
107         memset(ans1,-1,sizeof(ans1));
108         memset(ans2,-1,sizeof(ans2));
109         memset(vis1,0,sizeof(vis1));
110         memset(vis2,0,sizeof(vis2));
111         getMp();
112         bfs1();
113         bfs2();
114         int min=INF;
115         for(int i=0;i<n;i++)
116             for(int j=0;j<m;j++)
117             {
118                 if(ans1[i][j]+ans2[i][j]<min&&ans1[i][j]+ans2[i][j]>0)
119                 {
120                     min=ans1[i][j]+ans2[i][j];
121                 }
122             }
123         printf("%d\n",min*11);
124     }
125 }
时间: 2024-08-23 12:31:41

Find a way (BFS)的相关文章

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

图的两种遍历-DFS&amp;BFS

DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完: struct node { int next; //E[i].next指向图中与i同父的下一个结点 int to; //E[i].to指向图中i的子结点 }E[110]; int N; int fa[110]; //记录各点的父结点 bool vis[110]; //记录这个点

POJ 2251 Dungeon Master (bfs)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; char mat[50][50][50]; int vis[50][50][50]; int op[6][3]={0,-1,0, 0,1,0, 1,0,0, -1,0,0 ,0,0,1, 0,0,-1 }; int ok; in

hdu 1728 bfs **

简单bfs,记录好状态即可 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=