hdu--1728--special bfs

发现 很多 bfs很有意思啊 做完刚那题后 随机切的这题

这边 我们要求出 到达坐标<x,y>的转弯次数 并且要不断地更新取最小值 直到在符合条件的转弯次数下 找到了出口

所以 这里对于 <x,y>的初始化很重要 就是将它初始化为Inf 尽量大点就是了

然后在bfs中 对于同方向走路的点和从起点开始i走 是不需要增加转弯次数的 另外 就是要增加一次转弯次数了

蛮有意思的 =_=

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5
 6 int n , m , k;
 7 const int inf = 0x3f3f3f3f;
 8 const int size = 110;
 9 char mp[size][size];
10 int cnt[size][size];
11 int dir[4][2] = {-1,0,1,0,0,-1,0,1};
12 struct node
13 {
14     int x , y , pos , T;
15     node( ){};
16     node( int u , int v , int w , int z ):x(u),y(v),pos(w),T(z){};
17 };
18 queue<node>q;
19
20 void init()
21 {
22     memset( cnt , inf , sizeof(cnt) );
23     while( !q.empty() )
24     {
25         q.pop();
26     }
27 }
28
29 bool bfs( int x1 , int y1 , int x2 , int y2 )
30 {
31     node now;
32     q.push( node(x1,y1,-1,0) );
33     while( !q.empty() )
34     {
35         now = q.front();
36         q.pop();
37         if( now.x==x2 && now.y==y2 && now.T<=k )
38         {
39             return true;
40         }
41         for( int i = 0 ; i<4 ; i++ )
42         {
43             int x = now.x + dir[i][0];
44             int y = now.y + dir[i][1];
45             if( x>=1 && x<=n && y>=1 && y<=m && mp[x][y]!=‘*‘ )
46             {
47                 if( now.pos==i || now.pos==-1 )
48                 {
49                     if( now.T <= cnt[x][y] )
50                     {
51                         cnt[x][y] = now.T;
52                         q.push( node( x , y , i , now.T ) );
53                     }
54                 }
55                 else
56                 {
57                     if( now.T+1 <= cnt[x][y])
58                     {
59                         cnt[x][y] = now.T+1;
60                         q.push( node( x , y , i , now.T+1 ) );
61                     }
62                 }
63             }
64         }
65     }
66     return false;
67 }
68
69 int main()
70 {
71     cin.sync_with_stdio(false);
72     int t , x1 , y1 , x2 , y2;
73     bool ans;
74     cin >> t;
75     while( t-- )
76     {
77         init();
78         cin >> n >> m;
79         for( int i = 1 ; i<=n ; i++ )
80         {
81             for( int j = 1 ; j<=m ; j++ )
82             {
83                 cin >> mp[i][j];
84             }
85         }
86         cin >> k >> y1 >> x1 >> y2 >> x2;
87         ans = bfs( x1 , y1 , x2 , y2 );
88         if( ans )
89             cout << "yes" << endl;
90         else
91             cout << "no" << endl;
92     }
93     return 0;
94 }

时间: 2024-10-10 16:50:58

hdu--1728--special bfs的相关文章

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

hdu 1728 bfs 最小拐弯数

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 之前没有做过类似这种要最少拐弯数的题目,一般求最少的用bfs应该比较好..但是之前bfs一般都是用来求最小步数,也就可以标记过走过的点不再走.现在本题要的是最小的拐弯数,所以不能标记走过的点..需要一个数组来记录当前这个点所需要的最小拐弯数,如果此时这个点的拐弯数比之前该点的拐弯数还小或者等于就更新这个值.遍历全图直到找到解为止. 学习:对于bfs找最优解的变形.明白如何更新拐弯数的,保证最小.

hdu 1728 逃离迷宫 (bfs+循环队列)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15248    Accepted Submission(s): 3681 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

HDU 1728 逃离迷宫

这道题做的我想哭啊..WA了将近十次了吧 一开始我用数组模拟的队列,后来和老大代码对拍,感觉改的是基本都一模一样了,还是WA 实在没有办法了,改用queue了 题目里的x是列y是行,和代码里的反过来的,要注意! 题目里面说在起点的时候无论朝哪个方向走都不算一次转弯,所以我们将方向和转弯次数都赋值为-1,这样就不用特殊处理了 入队条件,拓展后的转弯次数小于或等于vis数组中记录的最小转弯次数即可入队 输出结果,不要一搜到终点便急着输出,应为可能后面再一次搜到终点的时候转弯次数小于k 因此可以遍历完

hdu 1728

Y - 逃离迷宫 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1728 Appoint description:  System Crawler  (2014-11-13) Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,g

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

HDU 3395 Special Fish 最“大”费用最大流

求最大费用可以将边权取负以转化成求最小费用.然而此时依然不对,因为会优先寻找最大流,但是答案并不一定出现在满流的时候.所以要加一些边(下图中的红边)使其在答案出现时满流.设所有边的流量为1,花费如下图所示.显然最大花费是1001,而没有红边的情况下会得到3. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio>

HDU 4569 Special equations(数学推论)

题目 //想不出来,看了解题报告 /* 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有f(x+p)%p=0. 所以我们可以开始从0到p枚举x,当f(x)%p=0,然后再从x到p*p枚举,不过每次都是+p,找到了输出即可,没有的话No solution! */ #include<stdio.h> int main() { int t,n; __int64 a[5],p; scanf(

逃离迷宫HDU - 1728

逃离迷宫HDU - 1728 主要是要记录转弯的次数. 1 #include <iostream> 2 #include <stdio.h> 3 #define ll long long 4 using namespace std; 5 int n,m,gx,gy,p[110][110],k; 6 int dx[] = {1,0,-1,0},dy[] = {0,-1,0,1}; 7 char str[110][110]; 8 bool flag; 9 10 void dfs (in