标签:双向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