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=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 typedef long long ll;
 13 #define cl(a) memset(a,0,sizeof(a))
 14 #define ts printf("*****\n");
 15 const int MAXN=105;
 16 int n,m,tt,k;
 17 int dir[4][2]={1,0,-1,0,0,1,0,-1};
 18 char s[MAXN][MAXN];
 19 struct Node
 20 {
 21     int x,y;
 22     int st;
 23     int t;
 24 }node[MAXN],st,ed;
 25 bool vis[MAXN][MAXN][5][15];
 26 bool bfs()
 27 {
 28     queue<Node> q;
 29     cl(vis);
 30     Node now,next;
 31     st.t=0;
 32     st.st=0;
 33     vis[st.x][st.y][st.st][st.t]=1;
 34     q.push(st);
 35     st.st=1;
 36     vis[st.x][st.y][st.st][st.t]=1;
 37     q.push(st);
 38     st.st=2;
 39     vis[st.x][st.y][st.st][st.t]=1;
 40     q.push(st);
 41     st.st=3;
 42     vis[st.x][st.y][st.st][st.t]=1;
 43     q.push(st);
 44     while(!q.empty())
 45     {
 46         now=q.front();
 47         q.pop();
 48         if(now.x==ed.x&&now.y==ed.y)
 49         {
 50             return 1;
 51         }
 52         for(int i=0;i<4;i++)
 53         {
 54             next.x=now.x+dir[i][0];
 55             next.y=now.y+dir[i][1];
 56             next.t=now.t;
 57             next.st=i;
 58             if(i!=now.st)   next.t+=1,next.st=i;
 59             if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&!vis[next.x][next.y][i][next.t]&&s[next.x][next.y]!=‘*‘&&next.t<=k)
 60             {
 61                 if(now.st==i)
 62                 {
 63                     q.push(next);
 64                     vis[next.x][next.y][i][next.t]=1;
 65                 }
 66                 else
 67                 {
 68                     q.push(next);
 69                     vis[next.x][next.y][i][next.t]=1;
 70                 }
 71             }
 72         }
 73     }
 74     return 0;
 75 }
 76 int main()
 77 {
 78     int i,j;
 79     #ifndef ONLINE_JUDGE
 80     freopen("1.in","r",stdin);
 81     #endif
 82     scanf("%d",&tt);
 83     while(tt--)
 84     {
 85         scanf("%d%d",&n,&m);
 86         for(i=0;i<n;i++)
 87         {
 88             scanf("%s",&s[i]);
 89         }
 90         scanf("%d%d%d%d%d",&k,&st.y,&st.x,&ed.y,&ed.x);
 91         st.x-=1;
 92         st.y-=1;
 93         ed.x-=1;
 94         ed.y-=1;
 95         if(bfs())
 96         {
 97             printf("yes\n");
 98         }
 99         else    printf("no\n");
100     }
101 }
时间: 2024-10-25 17:54:56

hdu 1728 bfs **的相关文章

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): 21384    Accepted Submission(s): 5180 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

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+循环队列)

逃离迷宫 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 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

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

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa