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