hdu1278(BFS)

关于BFS的题目,可以参考http://blog.csdn.net/cambridgeacm/article/category/1169182,比较多,我只做了一部分就做不下去了

这几天一直在写BFS,算是二维,三维,优先,指定转弯次数……烦了,真的烦了,下次换个类型写吧

题目要求转弯的次数不能超过k,BFS,从一个方向搜到底

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 
 7 int m,n;
 8 char map[105][105];
 9 int visited[105][105];
10 int k,x1,y1,x2,y2;
11 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
12 struct node
13 {
14     int x;
15     int y;
16     int turn;
17 };
18 //queue<node> que;
19 
20 void bfs()
21 {
22     memset(visited,0,sizeof(visited));
23     queue<node> que;
24     node head,tail;
25     head.x=x1;
26     head.y=y1;
27     head.turn=-1;
28     que.push(head);
29     while(!que.empty())
30     {
31         head=que.front();
32         que.pop();
33         for(int i=0;i<4;i++)
34         {
35             int xx=head.x+dir[i][0];
36             int yy=head.y+dir[i][1];
37             /*if(xx==x2 && yy==y2 && head.turn<=k)
38             {
39                 printf("yes\n");
40                 return ;
41             }*/
42             while(xx>=1 && xx<=m && yy>=1 && yy<=n && map[xx][yy]!='*')
43             {
44                 if(visited[xx][yy]==0)
45                 {
46                     visited[xx][yy]=1;
47                     tail.x=xx;
48                     tail.y=yy;
49                     tail.turn=head.turn+1;
50                     if(xx==x2 && yy==y2 && tail.turn<=k)
51                     {
52                         printf("yes\n");
53                         return ;
54                     }
55                         que.push(tail);
56                 }
57                 xx=xx+dir[i][0];
58                 yy=yy+dir[i][1];
59             }
60         }
61     }
62     printf("no\n");
63     //return ;
64 }
65 int main()
66 {
67     int Case;
68     scanf("%d",&Case);
69     getchar();
70     char ch;
71     while(Case--)
72     {
73         scanf("%d%d",&m,&n);
74 
75         for(int i=1;i<=m;i++)
76         {
77             getchar();
78             for(int j=1;j<=n;j++)
79             {
80                 scanf("%c",&ch);
81                 map[i][j]=ch;
82             }
83             //getchar();
84         }
85         scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
86         if(x1==x2 && y1==y2) printf("yes\n");
87         else bfs();
88     }
89     return 0;
90 }

写了这么多题下来,我个人感觉是广搜比深搜好写,深搜那个递归总是把我弄得晕晕的,广搜这类题就像是在做游戏,你只要知道怎么搜就可以,就拿这道题来说吧,刚开始真的是不知道到底怎么处理转弯次数这个东东,看了别人的思路之后这就不难写了,思路说真的不涉及任何算法,只是算是种方法,不过真的就是没有想到,唉……思维能力还是太差了啊,加强训练……

posted on 2012-08-16 22:17  矮人狙击手!  阅读(242)  评论(0编辑  收藏  举报

导航