标签:双向bfs
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 22121 | Accepted: 10332 |
Description
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
分析:最基础的bfs,没用单向的广搜,学习了一下怎么用双向的广搜。
以下仅个人观点。。。
能用到双向广搜的题,首先得有开始点和目标点,然后就是从开始和目标同时出发,分别进行单向搜索,知道某一方向的搜索碰到另一方向搜索过得点为止。。
#include <stdio.h> #include <queue> #include <string.h> #define M 305 using namespace std; int dis1[M][M], dis2[M][M], len; const int dx[] = {1, 1, -1, -1, 2, 2, -2, -2}; //方向 const int dy[] = {2, -2, 2, -2, 1, -1, 1, -1}; struct node{ int x, y; }st, en; int limit(node a){ return (a.x>=0&&a.x<len&&a.y>=0&&a.y<len); } void dobfs(){ int i, size; dis1[st.x][st.y] = dis2[en.x][en.y] = 0; queue<node> p, q; q.push(st); p.push(en); while(!q.empty()&&!p.empty()){ size = q.size(); while(size --){ node cur = q.front(); q.pop(); if(limit(cur)&&dis2[cur.x][cur.y] != -1){ //printf("%d %d..1\n", dis1[cur.x][cur.y], dis2[cur.x][cur.y]); printf("%d\n", dis1[cur.x][cur.y]+dis2[cur.x][cur.y]); return ; } for(i = 0; i < 8; i ++){ node temp = cur; temp.x+=dx[i], temp.y += dy[i]; if(limit(temp)&&dis2[temp.x][temp.y] != -1){ //printf("%d %d....1\n", dis1[cur.x][cur.y], dis2[temp.x][temp.y]); printf("%d\n", dis1[cur.x][cur.y]+dis2[temp.x][temp.y]+1); return ; } if(limit(temp)&&dis1[temp.x][temp.y] == -1){ q.push(temp); dis1[temp.x][temp.y] = dis1[cur.x][cur.y]+1; } } } size = p.size(); while(size --){ node cur = p.front(); p.pop(); if(limit(cur)&&dis1[cur.x][cur.y] != -1){ //printf("%d %d..2\n", dis1[cur.x][cur.y], dis2[cur.x][cur.y]); printf("%d\n", dis1[cur.x][cur.x]+dis2[cur.x][cur.y]); return ; } for(i = 0; i < 8; i ++){ node temp = cur; temp.x += dx[i]; temp.y += dy[i]; if(limit(temp)&&dis1[temp.x][temp.y] != -1){ //printf("%d %d....2\n", dis2[cur.x][cur.y], dis1[temp.x][temp.y]); printf("%d\n", dis1[temp.x][temp.y]+dis2[cur.x][cur.y]+1); return ; } if(limit(temp)&&dis2[temp.x][temp.y] == -1){ p.push(temp); dis2[temp.x][temp.y] = dis2[cur.x][cur.y] + 1; } } } } } int main(){ int t; scanf("%d", &t); while(t --){ scanf("%d", &len); scanf("%d%d%d%d", &st.x, &st.y, &en.x, &en.y); memset(dis1, -1, sizeof(dis1)); memset(dis2, -1, sizeof(dis2)); if(match(st, en)){ printf("0\n"); continue; } else dobfs(); } return 0; }
标签:双向bfs
原文地址:http://blog.csdn.net/shengweisong/article/details/40343477