POJ 1915 双向广搜

//10224045	c00h00g	1915	Accepted	1328K	79MS	C++	2493B	2012-05-22 11:35:10
#include<iostream>
#include<queue>
using namespace std;

int mat[305][305];
int d1[305][305];//head
int d2[305][305];//tail
struct Node{
	int x,y;
};
int N,n;
int res;
bool found;
queue<Node> qhead,qtail;
Node nd[305];
int visited[305][305];
int dir[8][2]={
	{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}
};
bool check(int x,int y){
	if(x<0||y<0||x>=n||y>=n)
		return false;
	return true;
}

void bfs(queue<Node> &q,bool flag){
	Node tmp=q.front();
	q.pop();
	//操作正向队列
	if(flag){
		for(int i=0;i<8;i++){
			if(check(tmp.x+dir[i][0],tmp.y+dir[i][1])&&visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]!=1){
				if(visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]==2){
					found=true;
					d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d1[tmp.x][tmp.y]+1;
					res=d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]+d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]];
					return;
				}
				visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=1;
				d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d1[tmp.x][tmp.y]+1;
				Node aa;
				aa.x=tmp.x+dir[i][0];
				aa.y=tmp.y+dir[i][1];
				qhead.push(aa);
			}
		}
	}else{
		for(int i=0;i<8;i++){
			if(check(tmp.x+dir[i][0],tmp.y+dir[i][1])&&visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]!=2){
				if(visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]==1){
					found=true;
					d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d2[tmp.x][tmp.y]+1;
					res=d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]+d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]];
					return;
				}
				visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=2;
				d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d2[tmp.x][tmp.y]+1;
				Node aa; 
				aa.x=tmp.x+dir[i][0];
				aa.y=tmp.y+dir[i][1];
				qtail.push(aa);
			}
	}
 }
}
int main(){
	scanf("%d",&N);
	Node start,end;
	while(N--){
		while(!qhead.empty())
			qhead.pop();
		while(!qtail.empty())
			qtail.pop();
		res=0;
		found=false;
		memset(d1,0,sizeof(d1));
		memset(d2,0,sizeof(d2));
		memset(visited,0,sizeof(visited));

		scanf("%d",&n);
		scanf("%d%d",&start.x,&start.y);
		scanf("%d%d",&end.x,&end.y);
		bool flag=false;
		if(start.x==end.x&&start.y==end.y){
			res=0;
			flag=true;
		}
		if(!flag){
			qhead.push(start);
			qtail.push(end);
			visited[start.x][start.y]=1;
			visited[end.x][end.y]=2;
			while(!qhead.empty()||!qtail.empty()){
				if(!qhead.empty())
					bfs(qhead,true);
				if(found)
					break;
				if(!qtail.empty())
					bfs(qtail,false);
				if(found)
					break;
			}
		}
		printf("%d\n",res);
	}
	return 0;
}

你可能感兴趣的:(c)